C语言易错题集 第四部
生活随笔
收集整理的這篇文章主要介紹了
C语言易错题集 第四部
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
C語言易錯題集 第四部
- 一、位操作相關(guān)
- 二、switch()相關(guān)
- 三、輸出相關(guān)
- 四、實數(shù)相關(guān)
- 五、指針&a相關(guān)
- 六、指針訪問數(shù)組元素相關(guān)
- 七、轉(zhuǎn)義字符相關(guān)
- 八、類型提升問題
- 九、是不是正確的浮點數(shù)相關(guān)
- 十、define相關(guān)
- 十一、隱式轉(zhuǎn)換相關(guān)
- 十二、while相關(guān)
- 十三、++相關(guān)
- 十四、strlen()相關(guān)
- 十五、宏定義相關(guān)
一、位操作相關(guān)
執(zhí)行"int x=1;int y=~x;"語句后,y的值為?A 1 B 0 C -1 D -2 答案: Dx = 00000001 ~x = 11111110,~x為負數(shù),負數(shù)在計算機中用補碼表示,所以符號位不變,取反加1 y = 100000010二、switch()相關(guān)
若以下選項中的變量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是變量三、輸出相關(guān)
以下程序的輸出結(jié)果是( )。 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轉(zhuǎn)化為8進制為 100四、實數(shù)相關(guān)
以下選項中合法的實型常量是? A 0 B 3.13e-2.1 C .914 D 2.0*10 答案: C A選項為整型數(shù)據(jù)。B選項中e后面必須為整數(shù)。D選項是表達式,不是常量,所以選擇C。五、指針&a相關(guān)
下面代碼會輸出什么() 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 這邊主要考察的是數(shù)組指針和數(shù)組首地址的問題。 &a是數(shù)組指針,a是數(shù)組首地址。 而指針的+1,增加的是1個指針類型的長度。比如&a是數(shù)組指針,(&a + 1)增加的是1數(shù)組的長度。 所以題目中第四步的ptr指向的是a[4]的位置。 而(ptr - 1)減少的是1個數(shù)據(jù)元素的長度。第五步ptr指向的是a[3],頁就是4a 與 &a 的值是一樣的,但意思不一樣,a是數(shù)組首元素的首地址,也就是a[0]的首地址, &a是數(shù)組的首地址。 a+1是數(shù)組下一元素的首地址,即a[1]的首地址, 所以輸出2 &a+1是下一個數(shù)組的首地址,六、指針訪問數(shù)組元素相關(guān)
char s[3][4]; 則下列對數(shù)組元素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)結(jié)束后下一步運算是(a+i)[j], 而不是*(a+i),正確寫法是(*(a+i))[j]七、轉(zhuǎn)義字符相關(guān)
語句printf(“a\bre\’hi\’y\\\bou\n”);的輸出結(jié)果是()。A a\bre\’hi\'y\\\bou B a\bre\’hi\’y\bou C re’hi’you D abre’hi’y\bou 答案: C首先要明確該字符串中包含的轉(zhuǎn)義字符,”a \b re \’ hi \' y \\ \b ou \n”中的轉(zhuǎn)義字符共有6個,其中’\b’是退格符,輸出時將光標往左邊回退一個位置,‘\’’為單引號字符,’\\’為\字符,’\n’為回車換行符。所以顯示的結(jié)果為C。八、類型提升問題
以下代碼執(zhí)行后,val的值是___:unsigned long val = 0; char a = 0x48; char b = 0x52; val = b << 8 | a;A 20992 B 21064 C 72 D 0 答案: B九、是不是正確的浮點數(shù)相關(guān)
下面四個選項中,均是不合法的浮點數(shù)的選項是().160. 0.12 e3 123 2e4.2 .e5 -.18 123e4 0.0 -e3 .234 1e3 答案: B A e3沒有尾數(shù) 其他兩個都是浮點數(shù) B 123是整數(shù) 2e4.2 階碼不是整數(shù) .e5沒有尾數(shù) C 都是浮點數(shù) D -e3沒有尾數(shù) 其他都都是浮點數(shù)十、define相關(guān)
以下程序的輸出結(jié)果是: #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的邊際效應(yīng),直接展開,變成a+b*b+c+c+a=12十一、隱式轉(zhuǎn)換相關(guān)
下列代碼的輸出結(jié)果是 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隱式的要轉(zhuǎn)換為unsigned int 1000 0001 反碼; 1111 1110 補碼:1111 1111 大于 j十二、while相關(guān)
若有以下程序 #include<stdio.h> main( ) { int a=-2,b=0;while(a++) ++b;printf("%d,%d\n",a,b); } 則程序的輸出結(jié)果是?A 1,1 B 1,2 C 2,1 D 2,2 答案: B 第一次while判斷條件中a++,先用后加,為-2不為0條件為真,執(zhí)行a的自加與++b操作, a的值變?yōu)?span id="ozvdkddzhkzd" class="token operator">-1,b的值變?yōu)?span id="ozvdkddzhkzd" class="token number">1。第二次while判斷后,a的值變?yōu)?span id="ozvdkddzhkzd" class="token number">0,b的值變?yōu)?span id="ozvdkddzhkzd" class="token number">2。 第三次while判斷條件為假,但是仍要執(zhí)行自加操作,即值為1,跳出循環(huán)。打印1和2。十三、++相關(guān)
int a=4,則對于表達式++(a++)的結(jié)果說法正確的是()A 結(jié)果為5 B 結(jié)果為6 C 結(jié)果為7 D 以上不都是 答案: D a++的結(jié)果是4,然后進行++4是不對的,++運算只是針對于變量的,不能對常量來進行++運算。十四、strlen()相關(guān)
設(shè)語句定義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 空格十五、宏定義相關(guān)
#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)經(jīng)過宏替換變成++a+b*++b+c,需要注意宏替換的原則,是不會憑空加括號的。 另外++優(yōu)先級大于*,因此會先++a 和++b,然后a=2,b=3進行a+b*b+c=2+3*3+3=14總結(jié)
以上是生活随笔為你收集整理的C语言易错题集 第四部的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。