本篇文章主要对上一篇文章的试题进行讲解,考虑到可能有些小伙伴并没有看发布的原题,
所以上一篇文章的链接就放在这里了 , 学完了C语言,来看看这些基础的C语言题目能不能快速准确的完成(内附有参与人数和通过人数,看看这些题目是否真的有难度)_Catzzz666的博客-CSDN博客希望没有看过题目的同学先看看链接中的题目再进行本篇文章的阅读,之前看过的同学
也可以再看一遍,看看有什么不理解的地方进行专门的查看,针对性的解决问题。
单选题 topic1让我们来看看这样一段程序,这个程序的理解起来很简单,就是求解进入for循环的次数,
难就难在unsigned char类型的i,因为unsigned char类型的数字永远不可能减小到一个小于0的数。
接下来进行思路讲解:
由于for循环没有初识条件,所以在第一次进入的时候,i的值就是7;
j++之后进行调整,i -= 3;第二次进入for循环时i为4;同理可以得到第三次进入时i的值调整为1;
接下来就是重点,本来i -= 3;i的值要变为-2,但是i的类型是unsigned int类型,所以不会减小到负数,
最小只能减小到0,那么此时-2怎么理解?
注意此时的-2其实不是-2,来看看它的原码,反码,补码(存储在内存中的是补码) ,由于i是字符类型,其实只要写出它的
后8位就能理解它的真正含义:
254 / 3商84余2,所以加上254进入的一次,一共进入85次for循环,之后i的值变为2;
接下来重复之前的步骤:
由于第174次并没有进入循环,所以循环实际上执行了173次,答案选择C。
topic2相对于第一题而言,这道题就比较简单了,当然,可能阅读文章的朋友们水平参差不齐,
所以在这里补充一个知识点,小写英文字母的ASCII码值比大写英文字母的ASCII码值大32,
这里的ch = ch - 'a' + 'A就是把小写字母转换为大写字母。
限制条件时(a%2!=0&&(ch>= 'a' &&ch<='z')),a是初始化为0的,也就是从第二个字符开始到字符2之前,
每隔一个字符把小写字母转换为大写字母,2不是英文字符,所以不进入if语句,再隔一个字符把f转换为F。
输入为1abcedf2df,那么输出就是1AbCeDf2dF,答案选择C项。
topic3这道题主要考察的是位运算符的使用,只要了解了位运算符的话,那么这道题也是没有难度的。
这道题有一个点需要我们注意:那就是抓住一定可以这四个关键字 。
试想一下,我们并不知道flag的bit位上具体有什么,那么就需要使用位运算符的性质了,
&按位与:只有两个数相同位同为1才的得到1,否则为0,那么就这道题而言我们想是否可以&一个
第二个bit位为0的数字把第二个bit数字置为0,答案是可以的。
所以A选项正确,其他选项有兴趣的铁汁们可以尝试是否能够满足题意。
topic4首先补充一个概念:
对齐数 = 编译器默认的一个对齐数和该成员大小的最小值
编译器默认的这个对齐数是可以通过#pragma pack()来修改的,括号内部就是修改后的默认对齐数
结构体内存对齐是怎样对齐的?
这里主要有3点需要理解:
- 结构体的第一个成员总是在0对齐处
- 后面的成员需要对齐到对齐数的整数倍处
- 结构体中的结构体应对齐到结构体最大对齐数的整数倍处
- 结构体大小为最大对齐数的整数倍
结构体内存对齐的题目最好借助画图板画出来,这样有助于理解和求解;
先来看第一种情况:
#pragma pack(4)
struct One:
struct Two:
第二种情况:
#pragma pack(8)
struct One:
struct Two:
答案选择C项。
topic5遇到这些程序输出结果的题目,只要认真分析程序都能够找到正确答案,但是一定要认真。
像这道题,x初始化为1,进入do...while循环后x++,循环的判断条件x--;
这样的话输出的x始终为1,而且会死循环的打印1,答案选择D。
topic6求程序的输出结果
这道题有一个坑,那就是b是一个unsigned int类型的数字,很多人认为结果不可能是一个负数;
到底是不是这样,我们来分析一下:
内存中存储的是这个数的补码,所以进行加法的时候会补码相加,然后存储在=左边的变量中,
答案选择A项。
topic7题目可以理解为p指向的是一个二维数组:
还有一点需要注意的是数组p中的元素是char*类型的。
二维数组中可以通过p[1]或者*(p+1)找到第一行,此时指针指向的是B;
再进行+3然后解引用找到J。
*(p[1]+3)或者*(*(p+1)+3)
答案选择B项。
topic8
这道题先调用f内的f(2)结果为3;
i的值就是f(3),f(3)进行调用:
答案选择C项。
topic9int p[][4]={{1},{3,2},{4,5,6},{0}};中,p[1][2]的值是多少?
这道题直接画出它的结构图就能够直接观察出结果:
这道题的易错点在于有很多人并没有画出它的结构图,而是理所当然的把它
的列从1开始然后,结果得出结果为2,一定要记住的是:
二维数组的行和列都是从0开始的。
这道题的结果为0,选择B项。
topic10
这道题考察的知识点相对单一,只要知道移位运算符和位运算符的运用规则就能轻松解决;
答案选择A项。
topic11
这道题的ACD选项非常容易理解,都是没有问题的;
B选项,注意const的运用;
- 在C语言中,const修饰的是常变量
- 在C++中,const修饰的是常量,并且会有类型检查
而宏定义常量并没有类型检查,所以更倾向于使用const修饰常量。
答案选择不正确的B项。
topic12关于指针的描述,感兴趣的小伙伴可以看看我主页内的文章-指针初阶和指针进阶的内容,
就这道题而言,A选项肯定是错误的,free释放一块空间后,指针变量的值不会被置为空,
如果free之后继续使用就会造成野指针的问题,一般在free掉一个指针变量之后我们都会手动把
该指针变量的值置为NULL,答案选择A项。
topic13这里借用一张图,来自鹏哥的板书,有很大的研究价值,编译链接的细节处理:
但是这里是不能发现函数未定义的,所以借助VS2019经常报的一个错误来更好的理解:LNK...
这里其实就是链接期间发现函数未定义。
上图图示的是ADD函数使用的过程中,并没有定义ADD,只是定义了aDD函数,发生在链接期间的错误。
答案选择C项。
topic14遇到#define定义的常量和宏的问题,直接进行替换就行了 ,以这道题为例:
答案选择A项。
topic15
解答这道题之前需要了解一个概念:
整型提升:
CPU中只能进行整型的加减,如果进行char类型的加减需要整型提升为整型计算,计算的结果发生截断
再存储在char类型中。
其它的类型也有着异曲同工之妙,在计算时会向大字节的类型转换,a*b是int类型+d之后变为double类型,
最终结果也是double类型,答案选择D项。
由于内容比较多,所以今天先更新单选题目的答案,编程题目的答案会在明天更新出来,这些单选题目还是
有很多的参考价值的,不仅可以检测自己的C语言水平到底如何,还能够进行查漏补缺,希望铁汁们继续努力,
争做更好的自己。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)