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语言易错题集 第四部的全部內容,希望文章能夠幫你解決所遇到的問題。