日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言易错题集 第一部

發(fā)布時間:2025/3/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言易错题集 第一部 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 一、優(yōu)先級相關(guān)
  • 二、指針相關(guān)
  • 三、標(biāo)識符相關(guān)
  • 四、指針相關(guān)
  • 五、指針相關(guān)
  • 六、指針相關(guān)
  • 七、字符串相關(guān)
  • 八、i++相關(guān)
  • 九、傳遞相關(guān)
  • 十、#include相關(guān)
  • 十一、字符串長度相關(guān)
  • 十二、復(fù)雜表達式計算相關(guān)
  • 十三、靜態(tài)變量相關(guān)
  • 十四、sizeof()和strlen()相關(guān)
  • 十五、&&(短路特性)相關(guān)

一、優(yōu)先級相關(guān)

: 以下代碼輸出啥? int i=10,j=2;i*=j+8;printf("%d\n",i);

結(jié)果 : 100
原因: *= 的優(yōu)先級小于 +

運算過程: i *= j+8; i = i *(j+8); i = 10*(2+8); i = 100;

二、指針相關(guān)

: 以下代碼在32位的操作系統(tǒng)下輸出多少? #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 原因: 系統(tǒng)可尋址的地址長度。 系統(tǒng) = 操作系統(tǒng) 32位操作系統(tǒng)為4字節(jié) 也就是 32位 64位操作系統(tǒng)為8字節(jié) 也就是 64位 注意: 和指針的類型沒有一丁點的關(guān)系 只和 操作系統(tǒng)的位數(shù)有關(guān)

三、標(biāo)識符相關(guān)

: 下列標(biāo)識符中,不合法的 C 語言用戶自定義標(biāo)識符是()。 A printf B enum C - D sin 答案: B 為啥printf 可以呢? 我們往下看 原因: 我們首先來回顧一下C語言用戶自定義標(biāo)識符的規(guī)則。 C語言用戶自定義標(biāo)識符的規(guī)則: 標(biāo)識符只能是由英文字母,數(shù)字,下劃線(_)組成并且開頭不能是數(shù)字,且英文的大小寫是有區(qū)別的。例: ad 和 Ad 是不同的標(biāo)識符。 關(guān)鍵字是C語言的保留字,通常已有各自的用途,不能用來作標(biāo)識符。例: if int .....等都是保留字 通過C語言用戶自定義標(biāo)識符的規(guī)則我們可以知道,它并沒有說用戶自定義標(biāo)識符不可以和C語言庫函數(shù)同名。 所以用戶自定義標(biāo)識符可以和C語言庫函數(shù)同名。 你也可以這樣理解:答案沒有printf的意思可能是因為,printf在C語言頭文件include<stdio.h>里面, 如果不引用的話,那么printf就可以作為標(biāo)識符,但是enum是關(guān)鍵字和int等一樣,不管你引不引,都存在的 。

代碼驗證:

通過上圖我們可以看出:0 error 程序可以運行,所以說用printf做標(biāo)識符是可以的。

再看下圖:

我們把printf做標(biāo)識符了 ,當(dāng)我們用printf()函數(shù)輸出的時候卻錯誤了。這是因為 printf 標(biāo)識符和printf()函數(shù)重名了,它已經(jīng)失去了printf()函數(shù)輸出功能的原意。

本題總結(jié): 用戶標(biāo)識符如果與關(guān)鍵字相同,則編譯時會出錯;如果與系統(tǒng)函數(shù)名(預(yù)定義標(biāo)識符)相同,編譯時不會出錯, 但系統(tǒng)函數(shù)名(預(yù)定義標(biāo)識符)的原意失去了,或會導(dǎo)致結(jié)果出錯,因此系統(tǒng)函數(shù)名(預(yù)定義標(biāo)識符)一般不用來作為用戶標(biāo)識符。

四、指針相關(guān)

下面敘述錯誤的是() char acX[]=”abc”; char acY[]={‘a(chǎn)’,’b’,’c’}; char *szX=”abc”; char *szY=”abc”; A acX與acY的內(nèi)容可以修改 B szX與szY指向同一個地址 C acX占用的內(nèi)存空間比acY占用的大 D szX的內(nèi)容修改后,szY的內(nèi)容也會被更改 答案: D 原因:szX , szY 2個指針指向常量區(qū),修改之后指向了另一個常量,相當(dāng)于把指針重定向了。szX 修改后指向了另一個常量,而szY 還是指向原來的常量。

代碼解釋:

五、指針相關(guān)

聲明一個指向含有10個元素的數(shù)組的指針,其中每個元素是一個函數(shù)指針,該函數(shù)的返回值是int,參數(shù)是int*,正確的是()A int *p[10])(int*) B int [10]*p(int *) C int (*(*p)[10])(int *) D int ((int *)[10])*p E 以上選項都不正確 答案: C 先看未定義標(biāo)識符p,p的左邊是**p表示一個指針,跳出括號,由于[]的結(jié)合性大于*,所以*p指向一個大小為10的數(shù)組, 即(*p)[10]。左邊又有一個*號,修釋數(shù)組的元素,*(*p)[10]表示*p指向一個大小為10的數(shù)組,且每個數(shù)組的元素為一個指針。 跳出括號,根據(jù)右邊(int *)可以判斷(*(*p)[10])是一個函數(shù)指針,該函數(shù)的參數(shù)是int*,返回值是int。所以選C。或者這樣理解: C. 首先題目說要聲明一個數(shù)組指針, 一般我們想到的數(shù)組指針是 隨便來一個 int(*p)[10], 然后又說每個元素是一個函數(shù)指針,那么我們隨便來一個 函數(shù)指針 int (*pf)(int *) . 然后把(*p)[10]作為一個整體替代 pf 即 int(*(*p)[10]))(int *); 分析: 判斷一個復(fù)雜式子看最高優(yōu)先級的,*p是一個指針,然后(*p)外面是[],所以是數(shù)組指針, (*p)[10])描述完畢,然后再看外面int(*)(int *)很明顯,這是一個函數(shù)指針,所以這個數(shù)組中每個元素是函數(shù)指針

六、指針相關(guān)

執(zhí)行以下語句,輸出結(jié)果為() 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為指針數(shù)組,str[0]=p1,因為p1指向char型,所以str[0]+1中的加1表示的意思是加一個字符的長度, 所以輸出為e. 指針加減,加減的是指針?biāo)赶虻臄?shù)據(jù)類型的長度單位。


這里容易錯的是以為 a[0]+1是a[1]了,我們可以從上圖看到 a[0]和a[1]沒有聯(lián)系。

七、字符串相關(guān)

有以下程序 main() { char a[7]="a0\0a0\0"; int i,j; i=sizeof(a); j=strlen(a); printf("%d %d\n",i,j); } 程序運行后的輸出結(jié)果是( )。 答案: 7 2 原因: sizeof(a) 是指a的內(nèi)存空間大小。strlen() 查找到“\0”就結(jié)束,且不計算'\0'

八、i++相關(guān)

以下程序的輸出結(jié)果是()?main() {int s,i;for(s=0,i=1;i<3;i++,s+=i);printf("%d\n",s); } 輸出: 5 i++ 之后再執(zhí)行s+=i,,所以第一次s=2, i=2時,i++后,s應(yīng)該是23

九、傳遞相關(guān)

有如下程序段:#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函數(shù)結(jié)果是: A Thunder Downloader B under Downloader C Thunderownloader D 程序崩潰 答案: D 1.參數(shù)是值傳遞,(p和str指向同一塊地方NULL2.但是函數(shù)又給參數(shù)p重新開辟空間,所以改變的是p指向的空間,str沒變(還是指向NULL)。 3.所以因為str沒有空間存放字符串,導(dǎo)致崩潰

下面對于這道題的擴展


通過上面的圖片我們可以看出: strcat()這個函數(shù)的意思就是拼接在后面,所以無論+多少,+1+2.。。。+7,都是拼接在Thunder后面, 但是要注意+n,這里的n不能超過str的長度,例如不能超過Thunder的長度,超過了就不在Thunder后面了

十、#include相關(guān)

#include命令的功能是()A 在命令處插入一個頭文件 B 在文件首部插入一個頭文件 C 在命令處插入一個文本文件 D 在文件首部插入一個程序文件 答案: C 原因: 預(yù)處理器發(fā)現(xiàn)#include后,就會尋找指令后面<>中的文件名,并把這個文件的內(nèi)容包含到當(dāng)前的文件中, 被包含的文件中的文本將替換源代碼文件中的#include指令

十一、字符串長度相關(guān)

表達式strlen("std\n007\1\\")的值是多少? 答案: 9 s t d \n 0 0 7 \1 \\ 一共九個 在字符串中\(zhòng)就是一個轉(zhuǎn)義字符,它和它后面的幾個字符可能算成是一個字符,具體后面跟幾個字符算成一個字符, 要看具體的字符是什么,比如說\123 是一個字符。

十二、復(fù)雜表達式計算相關(guān)

下面代碼的輸出結(jié)果是? #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注意: 有乘法和除法同級運算時,從左到右計算。

十三、靜態(tài)變量相關(guān)

下面程序會輸出什么: #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打印靜態(tài)全局變量a的值,為1fun1()對全局變量a重新賦值為2,因此第二個打印為2fun2()在函數(shù)內(nèi)部重新聲明了一個變量a,然后對該變量a賦值,該函數(shù)的作用域是本函數(shù), 并不影響全局變量a,因此第三個printf仍然為2fun3()在函數(shù)內(nèi)部聲明了一個靜態(tài)變量a,并將其賦值為4,雖然該變量在函數(shù)執(zhí)行結(jié)束后并不回收, 但是其作用域僅限于本函數(shù)內(nèi)部,printf同樣不時,仍然是外部的全局變量a的值。

十四、sizeof()和strlen()相關(guān)

下面程序的輸出結(jié)果為多少? #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 輸出結(jié)果為:6 5 4 4對字符串進行sizeof 操作的時候,會把字符串的結(jié)束符“\0”計算進去的, 進行strlen 操作求字符 串的長度的時候,不計算\0 的。 數(shù)組作為函數(shù)參數(shù)傳遞的時候,已經(jīng)退化為指針了,Func 函數(shù)的參數(shù)str_arg只是表示一個指 針,那個100不起任何作用的。

十五、&&(短路特性)相關(guān)

以下程序運行后的輸出結(jié)果是( ) #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的話,后面的不會執(zhí)行和賦值的,所以m還是0 《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的C语言易错题集 第一部的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。