C语言易错题集 第一部
生活随笔
收集整理的這篇文章主要介紹了
C语言易错题集 第一部
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- 一、優先級相關
- 二、指針相關
- 三、標識符相關
- 四、指針相關
- 五、指針相關
- 六、指針相關
- 七、字符串相關
- 八、i++相關
- 九、傳遞相關
- 十、#include相關
- 十一、字符串長度相關
- 十二、復雜表達式計算相關
- 十三、靜態變量相關
- 十四、sizeof()和strlen()相關
- 十五、&&(短路特性)相關
一、優先級相關
問: 以下代碼輸出啥? int i=10,j=2;i*=j+8;printf("%d\n",i);結果 : 100
原因: *= 的優先級小于 +
二、指針相關
問: 以下代碼在32位的操作系統下輸出多少? #include<stdio.h> #include<string.h> int main() {int *p=NULL;double *q=NULL;printf("%d\n",sizeof(p));printf("%d\n",sizeof(q));return 0; } 輸出: 4 4 原因: 系統可尋址的地址長度。 系統 = 操作系統 32位操作系統為4字節 也就是 32位 64位操作系統為8字節 也就是 64位 注意: 和指針的類型沒有一丁點的關系 只和 操作系統的位數有關三、標識符相關
問: 下列標識符中,不合法的 C 語言用戶自定義標識符是()。 A printf B enum C - D sin 答案: B 為啥printf 可以呢? 我們往下看 原因: 我們首先來回顧一下C語言用戶自定義標識符的規則。 C語言用戶自定義標識符的規則: 標識符只能是由英文字母,數字,下劃線(_)組成并且開頭不能是數字,且英文的大小寫是有區別的。例: ad 和 Ad 是不同的標識符。 關鍵字是C語言的保留字,通常已有各自的用途,不能用來作標識符。例: if int .....等都是保留字 通過C語言用戶自定義標識符的規則我們可以知道,它并沒有說用戶自定義標識符不可以和C語言庫函數同名。 所以用戶自定義標識符可以和C語言庫函數同名。 你也可以這樣理解:答案沒有printf的意思可能是因為,printf在C語言頭文件include<stdio.h>里面, 如果不引用的話,那么printf就可以作為標識符,但是enum是關鍵字和int等一樣,不管你引不引,都存在的 。代碼驗證:
通過上圖我們可以看出:0 error 程序可以運行,所以說用printf做標識符是可以的。
再看下圖:
我們把printf做標識符了 ,當我們用printf()函數輸出的時候卻錯誤了。這是因為 printf 標識符和printf()函數重名了,它已經失去了printf()函數輸出功能的原意。
四、指針相關
下面敘述錯誤的是() char acX[]=”abc”; char acY[]={‘a’,’b’,’c’}; char *szX=”abc”; char *szY=”abc”; A acX與acY的內容可以修改 B szX與szY指向同一個地址 C acX占用的內存空間比acY占用的大 D szX的內容修改后,szY的內容也會被更改 答案: D 原因:szX , szY 2個指針指向常量區,修改之后指向了另一個常量,相當于把指針重定向了。szX 修改后指向了另一個常量,而szY 還是指向原來的常量。代碼解釋:
五、指針相關
聲明一個指向含有10個元素的數組的指針,其中每個元素是一個函數指針,該函數的返回值是int,參數是int*,正確的是()A int *p[10])(int*) B int [10]*p(int *) C int (*(*p)[10])(int *) D int ((int *)[10])*p E 以上選項都不正確 答案: C 先看未定義標識符p,p的左邊是*,*p表示一個指針,跳出括號,由于[]的結合性大于*,所以*p指向一個大小為10的數組, 即(*p)[10]。左邊又有一個*號,修釋數組的元素,*(*p)[10]表示*p指向一個大小為10的數組,且每個數組的元素為一個指針。 跳出括號,根據右邊(int *)可以判斷(*(*p)[10])是一個函數指針,該函數的參數是int*,返回值是int。所以選C?;蛘哌@樣理解: C. 首先題目說要聲明一個數組指針, 一般我們想到的數組指針是 隨便來一個 int(*p)[10], 然后又說每個元素是一個函數指針,那么我們隨便來一個 函數指針 int (*pf)(int *) . 然后把(*p)[10]作為一個整體替代 pf 即 int(*(*p)[10]))(int *); 分析: 判斷一個復雜式子看最高優先級的,*p是一個指針,然后(*p)外面是[],所以是數組指針, (*p)[10])描述完畢,然后再看外面int(*)(int *)很明顯,這是一個函數指針,所以這個數組中每個元素是函數指針六、指針相關
執行以下語句,輸出結果為() char *p1="hello"; char *p2="world"; char *p3="a piece of cake"; char *str[]={p1,p2,p3}; printf("%c",*(str[0]+1));A world B hello C 編譯時錯誤 D 其他選項都不正確 答案: D str為指針數組,str[0]=p1,因為p1指向char型,所以str[0]+1中的加1表示的意思是加一個字符的長度, 所以輸出為e. 指針加減,加減的是指針所指向的數據類型的長度單位。
這里容易錯的是以為 a[0]+1是a[1]了,我們可以從上圖看到 a[0]和a[1]沒有聯系。
七、字符串相關
有以下程序 main() { char a[7]="a0\0a0\0"; int i,j; i=sizeof(a); j=strlen(a); printf("%d %d\n",i,j); } 程序運行后的輸出結果是( )。 答案: 7 2 原因: sizeof(a) 是指a的內存空間大小。strlen() 查找到“\0”就結束,且不計算'\0'。八、i++相關
以下程序的輸出結果是()?main() {int s,i;for(s=0,i=1;i<3;i++,s+=i);printf("%d\n",s); } 輸出: 5 i++ 之后再執行s+=i,,所以第一次s=2, i=2時,i++后,s應該是2+3,九、傳遞相關
有如下程序段:#include <iostream>void GetMemeory(char *p) {p = (char *)malloc(100); } void Test() {char *str = NULL;GetMemeory(str);strcpy(str, "Thunder");strcat(str + 2, "Downloader");printf(str); } 請問運行Test函數結果是: A Thunder Downloader B under Downloader C Thunderownloader D 程序崩潰 答案: D 1.參數是值傳遞,(p和str指向同一塊地方NULL) 2.但是函數又給參數p重新開辟空間,所以改變的是p指向的空間,str沒變(還是指向NULL)。 3.所以因為str沒有空間存放字符串,導致崩潰下面對于這道題的擴展
十、#include相關
#include命令的功能是()A 在命令處插入一個頭文件 B 在文件首部插入一個頭文件 C 在命令處插入一個文本文件 D 在文件首部插入一個程序文件 答案: C 原因: 預處理器發現#include后,就會尋找指令后面<>中的文件名,并把這個文件的內容包含到當前的文件中, 被包含的文件中的文本將替換源代碼文件中的#include指令十一、字符串長度相關
表達式strlen("std\n007\1\\")的值是多少? 答案: 9 s t d \n 0 0 7 \1 \\ 一共九個 在字符串中\就是一個轉義字符,它和它后面的幾個字符可能算成是一個字符,具體后面跟幾個字符算成一個字符, 要看具體的字符是什么,比如說\123 是一個字符。十二、復雜表達式計算相關
下面代碼的輸出結果是? #include<stdio.h> int main(){int z,x = 5,y = -10,a = 4,b = 2;z = x++ - --y * b/a;printf("%d\n",z);return 0; } 答案: 10 z=(x++)- (--y)*b/az=5-(-11)*2/4=5-(-22)/4=5-(-5)=10注意: 有乘法和除法同級運算時,從左到右計算。十三、靜態變量相關
下面程序會輸出什么: #include<stdio.h> static int a=1; void fun1(void) {a=2; } void fun2(void) {int a=3; } void fun3(void) {static int a=4; } int main() {printf(“%d”,a);fun1( );printf(“%d”,a);fun2( );printf(“%d”,a); fun3( )printf(“%d”,a); }A 1 2 3 4 B 1 2 2 2 C 1 2 2 4 D 1 1 1 4 答案: B 第一個printf打印靜態全局變量a的值,為1。 fun1()對全局變量a重新賦值為2,因此第二個打印為2。 fun2()在函數內部重新聲明了一個變量a,然后對該變量a賦值,該函數的作用域是本函數, 并不影響全局變量a,因此第三個printf仍然為2。 fun3()在函數內部聲明了一個靜態變量a,并將其賦值為4,雖然該變量在函數執行結束后并不回收, 但是其作用域僅限于本函數內部,printf同樣不時,仍然是外部的全局變量a的值。十四、sizeof()和strlen()相關
下面程序的輸出結果為多少? #include<stdio.h> #include<string.h> void Func(char str_arg[100]) {printf("%d\n", sizeof(str_arg)); } int main(void) {char str[] = "Hello";printf("%d\n", sizeof(str));printf("%d\n", strlen(str));char *p = str;printf("%d\n", sizeof(p));Func(str); }A 5 4 4 4 B 6 5 4 4 C 5 5 5 5 D 5 5 5 4 答案: B 輸出結果為:6 5 4 4對字符串進行sizeof 操作的時候,會把字符串的結束符“\0”計算進去的, 進行strlen 操作求字符 串的長度的時候,不計算\0 的。 數組作為函數參數傳遞的時候,已經退化為指針了,Func 函數的參數str_arg只是表示一個指 針,那個100不起任何作用的。十五、&&(短路特性)相關
以下程序運行后的輸出結果是( ) #include<stdio.h> int main() { int a=1,b=2,m=0,n=0,k;k=(n=b<a)&&(m=a) ; printf("%d,%d\n",k,m);return 0; }A 0,0 B 0,1 C 1,0 D 1,1 答案: A 第一個正常算出來,b<a 為假所以 n=0 ,為假(即false) 然后第二個的話,切記&&是短路運算,如果前面的為false的話,后面的不會執行和賦值的,所以m還是0 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的C语言易错题集 第一部的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 字符串整体赋值和比较问题
- 下一篇: 80C51单片机的最小系统