C语言易错题集 第四部
生活随笔
收集整理的这篇文章主要介绍了
C语言易错题集 第四部
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
C语言易错题集 第四部
- 一、位操作相关
- 二、switch()相关
- 三、输出相关
- 四、实数相关
- 五、指针&a相关
- 六、指针访问数组元素相关
- 七、转义字符相关
- 八、类型提升问题
- 九、是不是正确的浮点数相关
- 十、define相关
- 十一、隐式转换相关
- 十二、while相关
- 十三、++相关
- 十四、strlen()相关
- 十五、宏定义相关
一、位操作相关
执行"int x=1;int y=~x;"语句后,y的值为?A 1 B 0 C -1 D -2 答案: Dx = 00000001 ~x = 11111110,~x为负数,负数在计算机中用补码表示,所以符号位不变,取反加1 y = 100000010二、switch()相关
若以下选项中的变量a,b,y均以正确定义并赋值,则语法正确的switch语句是? A switch(a*a+b*b) { default:break;case 3 : y=a+b; break;case 2 : y=a-b; break; } B switch(a+b) { case 1 : case 3 : y=a+b;break;case 0 : case 4 : y=a-b;} C switch(a+9) { case a : y=a-b;case b : y=a+b; } D switch a*b { case 10 : y=a+b;default : y=a-b;} 答案 : ABC case a: a是变量 case b: b是变量三、输出相关
以下程序的输出结果是( )。 main() { char x=040;printf("%o\n",x<<1); }A 100 B 80 C 64 D 32 答案: A 040 以零开头 固是8进制为32 32<<1 左移1位 相当于扩大1倍 为 64 64转化为8进制为 100四、实数相关
以下选项中合法的实型常量是? A 0 B 3.13e-2.1 C .914 D 2.0*10 答案: C A选项为整型数据。B选项中e后面必须为整数。D选项是表达式,不是常量,所以选择C。五、指针&a相关
下面代码会输出什么() int main(int argc, char **argv) {int a[4] = {1, 2, 3, 4};int *ptr = (int *)(&a + 1);printf("%d", *(ptr - 1)); } A 1 B 2 C 3 D 4 答案: D 这边主要考察的是数组指针和数组首地址的问题。 &a是数组指针,a是数组首地址。 而指针的+1,增加的是1个指针类型的长度。比如&a是数组指针,(&a + 1)增加的是1数组的长度。 所以题目中第四步的ptr指向的是a[4]的位置。 而(ptr - 1)减少的是1个数据元素的长度。第五步ptr指向的是a[3],页就是4a 与 &a 的值是一样的,但意思不一样,a是数组首元素的首地址,也就是a[0]的首地址, &a是数组的首地址。 a+1是数组下一元素的首地址,即a[1]的首地址, 所以输出2 &a+1是下一个数组的首地址,六、指针访问数组元素相关
char s[3][4]; 则下列对数组元素s[i][j]的各种引用形式中,正确的是哪些? A * (s+i)[j] B * (&s[0][0]+4 * i+j) C * ((s+i)+j) D * ( * (s+i)[j]) 答案: B&s[0][0]得到的是首元素的地址, &s[0][0]+4 * i得到的是i行首元素的地址 &s[0][0]+4 * i+j得到的是s[i][j]的地址&s[i][j] * (&s[0][0]+4 * i+j)得到的就是s[i][j]的值。这道题的另外一种写法就是*(*(s+i)+j) A *(a+i)[j],错误的原因是(a+i)结束后下一步运算是(a+i)[j], 而不是*(a+i),正确写法是(*(a+i))[j]七、转义字符相关
语句printf(“a\bre\’hi\’y\\\bou\n”);的输出结果是()。A a\bre\’hi\'y\\\bou B a\bre\’hi\’y\bou C re’hi’you D abre’hi’y\bou 答案: C首先要明确该字符串中包含的转义字符,”a \b re \’ hi \' y \\ \b ou \n”中的转义字符共有6个,其中’\b’是退格符,输出时将光标往左边回退一个位置,‘\’’为单引号字符,’\\’为\字符,’\n’为回车换行符。所以显示的结果为C。八、类型提升问题
以下代码执行后,val的值是___:unsigned long val = 0; char a = 0x48; char b = 0x52; val = b << 8 | a;A 20992 B 21064 C 72 D 0 答案: B九、是不是正确的浮点数相关
下面四个选项中,均是不合法的浮点数的选项是().160. 0.12 e3 123 2e4.2 .e5 -.18 123e4 0.0 -e3 .234 1e3 答案: B A e3没有尾数 其他两个都是浮点数 B 123是整数 2e4.2 阶码不是整数 .e5没有尾数 C 都是浮点数 D -e3没有尾数 其他都都是浮点数十、define相关
以下程序的输出结果是: #define M(x,y,z) x*y+z main() {int a=1, b=2, c=3;printf("%d\n",M(a+b,b+c,c+a)); } A 19 B 17 C 15 D 12 答案: D 分析:#define的边际效应,直接展开,变成a+b*b+c+c+a=12十一、隐式转换相关
下列代码的输出结果是 int i = -1; unsigned j = 1; if (j > i)printf(" (j>i)成立\n"); elseprintf(" (j>i)不成立\n");if (i < j)printf(" (i<j)成立\n"); elseprintf(" (i<j)不成立\n"); A (j>i)成立,(i<j)成立 B (j>i)不成立,(i<j)成立 C (j>i)成立,(i<j)不成立 D (j>i)不成立,(i<j)不成立 答案: D int隐式的要转换为unsigned int 1000 0001 反码; 1111 1110 补码:1111 1111 大于 j十二、while相关
若有以下程序 #include<stdio.h> main( ) { int a=-2,b=0;while(a++) ++b;printf("%d,%d\n",a,b); } 则程序的输出结果是?A 1,1 B 1,2 C 2,1 D 2,2 答案: B 第一次while判断条件中a++,先用后加,为-2不为0条件为真,执行a的自加与++b操作, a的值变为-1,b的值变为1。第二次while判断后,a的值变为0,b的值变为2。 第三次while判断条件为假,但是仍要执行自加操作,即值为1,跳出循环。打印1和2。十三、++相关
int a=4,则对于表达式++(a++)的结果说法正确的是()A 结果为5 B 结果为6 C 结果为7 D 以上不都是 答案: D a++的结果是4,然后进行++4是不对的,++运算只是针对于变量的,不能对常量来进行++运算。十四、strlen()相关
设语句定义char a[ 80 ]= " 0123\0789 "; ,则sizeof(a)和strlen(a)的值分别为()。 A 80和9 B 80和7 C 80和5 D 80和6 答案: A 空格 0、1、2、3、\07、8、9 空格十五、宏定义相关
#include<stdio.h> #define Mul(x,y) ++x*++y void main() { int a = 1; int b = 2; int c = 3;printf(“%d”,Mul(a+b,b+c)); } 程序最后输出什么?( ) A 14 B 24 C 48 D 18 答案:A Mul(a+b,b+c)经过宏替换变成++a+b*++b+c,需要注意宏替换的原则,是不会凭空加括号的。 另外++优先级大于*,因此会先++a 和++b,然后a=2,b=3进行a+b*b+c=2+3*3+3=14总结
以上是生活随笔为你收集整理的C语言易错题集 第四部的全部内容,希望文章能够帮你解决所遇到的问题。