C语言易错题集 第三部
生活随笔
收集整理的這篇文章主要介紹了
C语言易错题集 第三部
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 一、C語言程序exe相關
- 二、sizeof和strlen相關
- 三、小端存儲相關
- 四、break和continue相關
- 五、函數聲明相關
- 六、遞歸相關
- 七、預處理相關
- 八、C語言程序的最小單元相關
- 九、指針相關
- 十、數組初始化相關
- 十一、鏈接相關
- 十二、負數變無符號數相關
- 十三、負數變無符號數相關
- 十四、union相關
- 十五、switch()相關
一、C語言程序exe相關
用 C 語言編寫的源程序須經過編譯連接后,生成擴展名為 .exe 的可執行文件,才能運行。()A 正確 B 錯誤 答案: B C語言編寫的程序,肯定是要經過一系列的編譯,鏈接,生成可執行的文件。在windows系統中,執行文件都是.exe為擴展名的。不過在linux系統中就不一樣了,linux系統并不區分擴展名,所以也就無所謂什么.exe之類的文件, 只要知道最終生成可執行的二進制文件就可以了。二、sizeof和strlen相關
下面程序的輸出結果為多少(32位機器上)? #include<stdio.h> #include<string.h> void Func(char str_arg[2]) {int m = sizeof(str_arg);int n = strlen(str_arg);printf("%d\n", m);printf("%d\n", n); } int main(void) {char str[] = "Hello";Func(str); }A 5 5 B 5 4 C 4 5 D 4 4 答案: C 1,對于void Func(charstr_arg[2]) 這一句不要被那個2誤導了 下面這些寫法都可以的。 voidFunc(charstr_arg[]) voidFunc(charstr_arg[1]) voidFunc(charstr_arg[2]) voidFunc(charstr_arg[3]) voidFunc(charstr_arg[4]) ... voidFunc(charstr_arg[200]) ...也可以寫成 voidFunc(char *str_arg)之所以能這樣寫,是因為Func的參數是一個地址2,對于sizeof的參數,是一個指針,因為這是32位系統, 32 = 8*4,需要4字節存儲指針。 如果是64位系統 64 = 8*8,需要8字節3,對于strlen,就是字符串的長度,"Hello"長度是5三、小端存儲相關
在x86的機器上,int a=0xabcd1234 char b=((char*)&a)[0]請問b是多少 A 0xa B 0x4 C 0xab D 0x34 答案: D x86是小端存儲,即高位存儲在高地址,低位存儲在低地址。 int a = 0xabcd1234; 內存中 ab cd 12 34,b作為一個char,右邊表達式指針指向為' 4 '轉化為16進制為 0x34.高 --> 低四、break和continue相關
C語言中break和continue語句說法正確的是() A break語句只應用于循環體中 B continue語句只應用于循環體中 C break是無條件跳轉語句,continue不是 D break和continue的跳轉范圍不夠明確,容易產生問題 答案: B A:break語句可以用于循環語句中,終止當前循環;也用于在switch語句中結束一個case 。A項錯誤。 B:continue語句只能用于循環語句,正確。 C:無條件跳轉語句有return , break , continue , goto 。C項錯誤。 D:在switch語句中,break用來使執行流程跳出switch語句。 在循環語句中,break語句用來使執行流無條件跳出本層循環體。 continue的功能是:結束本次循環,接著進行下一次是否執行循環的條件判定。break和continue語句跳轉范圍明確。D選項錯誤。 綜上本題選B。五、函數聲明相關
若有以下程序 #include<stdio.h> void f(int n); int main() { void f(int n); f(5); } void f(int n) { printf("%d\n",n); } 則以下敘述中不正確的是()。A 若只在主函數中對函數f進行說明,則只能在主函數中正確調用函數f B 若在主函數前對函數f進行說明,則在主函數和其后的其它函數中都可以正確調用函數f C 對于以上程序,編譯時系統會提示出錯信息:提示對對f函數重復說明 D 函數f無返回值,所以可用void將其類型定義為無值型 答案: A C A 若只在主函數中對函數f進行說明,則只能在主函數中正確調用函數f //解釋: 在f函數定義的后面,其它的函數也是可以調用f函數的B 若在主函數前對函數f進行說明,則在主函數和其后的其它函數中都可以正確調用函數f//正確C 對于以上程序,編譯時系統會提示出錯信息:提示對f函數重復說明 //解釋: 在C語言中變量或函數可以重復聲明,但是不能重復定義D 函數f無返回值,所以可用void將其類型定義為無值型 //正確六、遞歸相關
下列代碼的輸出是?(注:print已經聲明過) main() { char str[]="Geneius";print (str); } print(char *s) {if(*s){print(++s);printf("%c",*s); } }A suiene B neius C run-time error D suieneG 答案: A 1、*s為G,執行print(e),printf(e)被壓入倒數第1層,應該輸出e; 2、*s為e,執行print(n),printf(n)被壓入倒數第2層,應該輸出n; 3、*s為n,執行print(e),printf (e) 被壓入倒數第3層,應該輸出e; 4、*s為e,執行print(i),printf (i) 被壓入倒數第4層,應該輸出i; 5、*s為i,執行print(u),printf (u) 被壓入倒數第5層,應該輸出u; 6、*s為u,執行print(s),printf (s) 被壓入倒數第6層,應該輸出s; 7、*s為s,執行print(\0),printf (\0) 被壓入倒數第7層,應該輸出空格; 8、開始跳出print,從上向下得到壓入棧中的printf,得到最后結果“ suiene”七、預處理相關
源程序中凡是行首以#標識的控制行都是預處理指令。以上描述是否正確? A 正確 B 錯誤 答案: A C語言有效的預處理命令總是以“#”開頭 (1)頭文件包含#include (2)宏定義 #define (3)條件編譯 #ifdef #endif八、C語言程序的最小單元相關
C語言源程序的最小單位是()。A 程序行 B 語句 C 函數 D 字符 答案: D C語言源程序的最小單位是字符,最小執行單元是函數。九、指針相關
要使指針變量p指向2維數組A的第1個元素,正確的賦值表達式是()。A p=A或p=A[0] B p=A[0]或p=A[0][0] C p=A[0]或p=&A[0][0] D p=A或p=&A[0][0] 答案: C bingle頭像bingle P=A, 是錯誤的,A代表的是二維數組中,數組A[0]的地址,和元素A[0][0]的地址在 數值上是一樣的, 但是不能直接把A賦給P,原因是它們的類型不同。 A[0][0]是二維數組,*p相當于一維數組,類型不同十、數組初始化相關
下面對一維數組 a 進行正確的初始化的語句是()int a[10] = (0, 0, 0, 0, 0); int a[10] = {}; int a[10] = {10}; int a[10] = {10, 0, -1.23}; 答案: B C D A: 是小括號,錯誤,應為大括號。 D: 浮點數會被強制的轉換為整數,所以正確十一、鏈接相關
由多個源文件組成的C程序,經過編輯、預處理、編譯、鏈接等階段會生成最終的可執行程序。下面哪個階段可以發現被調用的函數未定義?A 預處理 B 編譯 C 鏈接 D 執行 答案: C鏈接是將各個編譯單元中的變量和函數引用與定義進行綁定,保證程序中的變量和函數都有對應的實體, 若被調用函數未定義,就在此過程中會發現。編輯階段創建和修改源程序;預處理階段分析宏定義以及替換宏引用; 編譯過程是把源程序翻譯為與之等價的目標程序。十二、負數變無符號數相關
有如下C語言程序段short si = -32767; unsigned short usi = si; 執行上述兩條語句后,usi的值為 ( )A -32767 B 32767 C 32768 D 32769 答案: D 因C語言中的數據在內存中為補碼表示形式 先把-32767表示成原碼形式是(因為補碼不是一步可以得到的,先原碼再補碼) (-32767)原碼=1111 1111 1111 1111 (-32767)補碼 =1000 0000 0000 0001 再把這個補碼賦給usi,usi會把最高位符號位1也當做數值位 usi=1000 0000 0000 0001=32769十三、負數變無符號數相關
#include<stdio.h> int main() {unsigned char i=7;int j=0;for(;i>0;i-=3){++j;}printf("%d\n",j);return 0; } 請問該程序的輸出是多少?A 2 B 死循環 C 173 D 172 答案: C 這題正著推不容易,可以考慮反著推 要想退出循環 最后必定是 i=0 0~255 是256個數 根據選項 A: (0 + 2*3) % 256 = 6 不是7 , 所以A錯誤 C: (0 + 173*3) % 256 = 7 , 所以C可以 D: (0 + 172*3) % 256 = 4 不是7,所以D錯誤 B: 既然C可以,當然B就錯誤第二種思路: -2的原碼是1000 0010,反碼是1111 1101,補碼是1111 1110,計算機中存儲的是補碼, 即存的是1111 1110,又因為這里是無符號的,所以最高位的1不代表符號, 所以1111 1110為254,同理,依次推,直到i為0,可得一共173次 7 4 1——3次 254 251....2——85次 255 252....3——85次 3-3為0,就不會進入循環了,一共173次十四、union相關
A 1 4 B 4 4 C 1 2 D 4 8 答案: D十五、switch()相關
若有以下程序 #include<stdio.h> main() { int s=0,n;for(n=0; n<4; n++){switch(n){default:s+=4;case 1:s+=1;case 2:s+=2;case 3:s+=3;}}printf ("%d\n",s); } 則程序的輸出結果是? A 6 B 18 C 10 D 24 答案: D 第1次:s=0+4+1+2+3=10; 和case 1,2 3,依次比對,最后沒有匹配的執行default 這時候開關相當于打開了,執行后面全部的。 第2次:s=10+1+2+3=16; 第3次:s=16+2+3=21; 第4次:s=21+3=24.在switch-case語句中,多個case可以共用一條執行語句,如: case 常量表達式1: case 常量表達式2: case 常量表達式3: 語句; break; 由此可以看出case語句的作用: case后面的常量表達式實際上只起語句標號作用,而不起條件判斷作用,即“只是開始執行處的入口標號”。因此,一旦與switch后面圓括號中表達式的值匹配,就從此標號處開始執行; 而且執行完一個case后面的語句后,若沒遇到break語句,就自動進入下一個case繼續執行, 而不再判斷是否與之匹配,直到遇到break語句才停止執行,退出switch語句。因此,若想執行一個case分之后立即跳出switch語句,就必須在此分支的最后添加一個break語句。總結
以上是生活随笔為你收集整理的C语言易错题集 第三部的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 指向字符串的指针为何不能用来修改此字符串
- 下一篇: 练习C语言二级编程题的一些问题