asin c语言中 返回值范围_大学C语言考试易错知识点总结
作者:cggwz
來源:https://blog.csdn.net/cggwz/article/details/103740713?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-2&spm=1001.2101.3001.4242
文章目錄
運算符相關(guān)
自增(減)前后綴
邏輯運算符的短路問題
賦值運算符的返回值問題
運算符優(yōu)先級的問題
sizeof()的返回值問題
函數(shù)相關(guān)
函數(shù)聲明問題
mian函數(shù)參數(shù)問題
變量相關(guān)
用字符串初始化字符數(shù)組
賦初值問題
轉(zhuǎn)義字符問題
常用ASCII碼記憶
字符串常量占用內(nèi)存問題
字符變量值的問題
變量類型的范圍計算問題
字符串常量拼接問題
數(shù)組相關(guān)
數(shù)組下標越界
二維數(shù)組中行列計算問題
字符數(shù)組賦值問題
結(jié)構(gòu)體相關(guān)
結(jié)構(gòu)體所包含的變量不可初始化
查看結(jié)構(gòu)體內(nèi)部變量所占內(nèi)存大小
庫函數(shù)相關(guān)
絕對值函數(shù)
scanf()和printf()的返回值問題
fclose()的返回值問題
預(yù)編譯相關(guān)
注意宏定義的替換原則
后記
現(xiàn)在不少大學(xué)都把C語言作為一門必學(xué)的編程語言。C語言考試呢,并不能決定你的實踐能力怎么樣,他考的很多點,我們不知道,也可以在寫代碼時避免,我們舉個最簡單的例子,運算符優(yōu)先級,這恐怕是必考的內(nèi)容了。但實際上我們寫代碼并不需要背下這個,我們完全可以通過多加幾個括號解決問題。但是考試它并不會管這些,考試是別人出的題,所以代碼也是它的。而我們也需要一個較高的分數(shù),那么我們應(yīng)該怎么辦呢?
沒錯,這篇博客就是為了這個而誕生的。從cggwz個人的刷題經(jīng)歷,總結(jié)出易錯的一些點,提醒大家在考試中注意,那么廢話不多說,我們開始吧!
(再強調(diào)一遍:這里大部分是出卷人可能的設(shè)誤點,而不一定是你自己寫代碼的易錯點)
運算符相關(guān)
自增(減)前后綴
我們以自增為例,前綴和后綴的差別有兩點:
優(yōu)先級不同,后綴優(yōu)先級更高
返回值不同
雖說優(yōu)先級不同,但是在兩者之間也就邏輯非和按位取反,貌似不會有太大影響。
而重點是返回值,也就是說,++x返回的是x+1,而x++返回的是原來的x。
而x本身的值都會在返回值以后立刻改變,也就是執(zhí)行這個表達式后立即改變,比如:
int main(){
int x=0,y=2,z=1;
x=z++ + z;
printf("%d",x);
return 0;
}
這個輸出結(jié)果就是3,而不是2.
邏輯運算符的短路問題
C語言在計算邏輯運算符的時候是采取短路機制的,也就是說,如果已經(jīng)可以判斷這個表達式的最終結(jié)果,那么就不再判斷接下來的表達式,相應(yīng)地,那些表達式也不會被執(zhí)行。而出題人則喜歡通過放置一些賦值語句在后面,某些學(xué)生會因為忽略了短路機制,而誤以為會執(zhí)行,從而出錯,我們看個例子:
#includeint main(){
int x=3,y=2,z=1;
y=--z&&--x;
printf("%d",x);
return 0;
}
這里輸出是2嗎?
并不是,是3.
因為--z返回的值是0,而后面的邏輯運算符是&&,也就是說無論后面一個語句真假與否,這個表達式都是假,所以就會觸發(fā)短路機制,不再計算后面的++x,從而x的值不會改變。
我們來看個變式:
int main(){
int x=3,y=2,z=1;
y=--z&&--x||--x;
printf("%d",x);
return 0;
}
相信你現(xiàn)在應(yīng)該能知道結(jié)果了,輸出就是2.中間的那個–x并不會因為它在中間而被執(zhí)行。
賦值運算符的返回值問題
我們知道C語言中的賦值運算符是有返回值的。
它們的返回值是賦值后被賦值變量的值,而不是賦值符號右邊的表達式的值。
比如int a=10;a+=3;這里的+=返回的就不是3,而是13.
這也適用于類型轉(zhuǎn)換問題,比如double a;a=2;這里這個賦值語句的返回值就是2.0,而不是2.
運算符優(yōu)先級的問題
考試前必須要掌握的內(nèi)容之一。
但是顯然,我這里不會把一大張表放出來,要是需要看看課本就好了。
這里我是想總結(jié)一下這張表,讓大家更容易的“記住”這張表。
我們也會順帶地總結(jié)一下結(jié)合方向。
現(xiàn)在請翻開你的教材或是百度找到一張表,我們準備開車了。
首先第一梯隊,優(yōu)先級最高的,是一些指代所屬關(guān)系的運算符,比如[]、->、.。在加上一個圓括號。這個應(yīng)該很好理解。圓括號如同一個老大哥,它在改變運算順序這方面具有絕對的話語權(quán),自然會在第一梯隊,而這個老大哥也是懂人情的,->、.這類符號就好像是調(diào)用父對象里的一個子對象,把人家父子關(guān)系拆散恐怕不是一個老大哥應(yīng)該做的,所以它們也屬于第一梯隊。
它們的優(yōu)先級是最高的。
接下來第二梯隊主要是我們的單目運算符。比如正負號、指針符號、取地址、自加自減之類。它們通常是緊緊貼著它們作用的對象的(單目),那關(guān)系親密地如同情侶。雖然狗糧不好吃,但是不能因為嫉妒就拆散人家呀(誰說的,我就覺得可以),所以它們的優(yōu)先級也是比較高的,屬于第二梯隊。
第三梯隊就是我們的四大金剛啦——加減乘除,哦不,我們不能忘了我們除法的好兄弟——取余。所以它們五個就是我們的第三梯隊,我們可以把它們叫做算術(shù)運算符。這五大金剛可是從小學(xué)就開始陪伴我們了,自然在考慮完父子情、情侶情之后要考慮它們幾個了。
第四梯隊是位運算的左移和右移運算符。這兩個家伙雖然名氣沒有上面五大金剛大,但是它們也是可以改變變量的值呢,也可以算得上小金剛了。所以,第四梯隊,當之無愧。
第五梯隊是關(guān)系運算符,也就是表示大于小于不等這類符號。它們雖然也很早就開始陪伴我們,名氣也不小,但是畢竟是比較運算的結(jié)果,自然要等前兩個梯隊運算完,才能比較,那就只好屈居它們后面啦。
第六梯隊是位運算的按位與、或、異或。理論上它們也是改變數(shù)值的呀,為什么不在前面的梯隊呢?我們可以看看它們的樣子:&、|,正好是我們下面一個梯隊的一半,二者的關(guān)系情同手足,成功固然美好,但是一份兄弟情,哪是成功可以換來的?它們自然愿意留在兄弟身旁,相依相助。
第七梯隊是邏輯運算符,加上唯一一個三目運算符——條件運算符。它們連接的多半是關(guān)系運算符的結(jié)果,自然就得在關(guān)系運算符后面啦!
第八梯隊可是一個大部隊,賦值運算符。它們當然得殿后啦,它們可是把前面的運算結(jié)果保存下來的必經(jīng)之路。它們就如同慈愛的父母,默默地收拾前面這些孩子算出來的各種數(shù)據(jù),并把它們認真地保存下來。我們的父母在我們小時候,不也是這樣的嗎?
咦?我們好像還漏一個,沒錯,逗號運算符。存在感太低啦!就放在最后一個吧!(我想你們大部分人也很少用它)。
這樣我們的優(yōu)先級就徹底理清楚啦!
總結(jié)一下:
分量、下標運算符、圓括號>單目運算符>算數(shù)運算符(五大金剛加兩個小金剛)>關(guān)系運算符>位運算符(與或異或)>邏輯運算符(含條件運算符)>賦值運算符>逗號運算符
這個總結(jié)并不嚴謹,因為有些運算符并不是在一起的,所以要注意對我說的故事的理解,再結(jié)合表看看背背就OK了。
下面再說一下結(jié)合方向。
這個還是很好總結(jié)的,除了后綴自加自減的所有單目運算符、條件運算符、賦值運算符是右結(jié)合,其他的符號全是左結(jié)合。
這個還是很好理解的,那些單目運算符通常寫在作用對象的左邊,自然是從右向左結(jié)合,賦值符號也是把右邊的數(shù)值賦給左邊,所以也是從右向左,條件運算符……這么特殊的一個,記一下就好了。
這樣我們就成功地解決了這張令人頭疼的表。怎么樣?不困難吧?
sizeof()的返回值問題
首先強調(diào)一下,這個不是函數(shù),雖然它看起來很像。
它運算得到的值是括號內(nèi)的東西所占的內(nèi)存大小,它是一個int型的值。所以sizeof()的表達式是int型表達式。
函數(shù)相關(guān)
函數(shù)聲明問題
我們知道C語言里是需要函數(shù)聲明的,如果函數(shù)放在主調(diào)函數(shù)的后面,就需要在主調(diào)函數(shù)前進行原型聲明。
但是不知道有沒有像我一樣,由于長期把函數(shù)放在主調(diào)函數(shù)的前面(少打幾行字),而在考試時容易忘記聲明這件事。其實網(wǎng)上有不少信息學(xué)競賽題的代碼,它們絕大多數(shù)都是把函數(shù)放在主調(diào)函數(shù)前面,所以這里也算是一個提醒吧。
mian函數(shù)參數(shù)問題
我們知道m(xù)ain函數(shù)有三個參數(shù)argc,argv,envp
我們主要提示一下前面兩個。
現(xiàn)在如果我們在命令行執(zhí)行如下語句:
D:\cgg.exe how are you!
這么執(zhí)行后,argv是4,而不是3,因為D:\cgg.exe也是一個參數(shù),而它就保存在argv[0]中。
這一點千萬不能忘記。
變量相關(guān)
用字符串初始化字符數(shù)組
主要是長度的問題,我們知道C中的字符串是以一個空字符作為字符串的結(jié)尾標志。所以,我們在賦值時,要注意字符數(shù)組的長度要比字符串的長度多1。比如下面這段代碼是無法通過編譯的:
#includeint main(){
char a[4]="abcd";
return 0;
}
而我們只需要把a的長度改為5就好了。
賦初值問題
這是一個老生常談的問題,但是還是很容易被忽略。所以在這里再說一下。當遇到一些計算求值類的題,一定要注意把變量初始化,賦初值,比如0.
轉(zhuǎn)義字符問題
我們知道C語言中是有轉(zhuǎn)義字符的。轉(zhuǎn)義字符以\開頭,所以,我們是不能在一對單引號中間直接放置右斜杠的,還有就是注意,斜杠后如果是十六進制的表示碼,開頭是x或X,而不是0x或0X
常用ASCII碼記憶
常用的無非是大小寫字母和數(shù)字,這時一定需要記住的(除非你是上機考試)。
| A | 65 |
| a | 97 |
| 0 | 48 |
| CR(回車) | 13 |
| 空格 | 32 |
字符串常量占用內(nèi)存問題
我們知道C中的字符串一定是以空字符‘\0’結(jié)尾,而這個空字符是不顯示的。所以有的出題老師會在這里設(shè)坑,比如:"abcde"占的內(nèi)存大小是多少字節(jié)?雖然是五個字符,但是實際上還有一個空字符,總共是6字節(jié)。
字符變量值的問題
我們經(jīng)常會遇到這樣的題,問你某個字符的值是什么。
這時我們需要尤其小心,尤其是選擇題。
我們舉個例子來說:char a='C'
a的值是什么?
是C嗎?
如果你說是,那就錯了。
我們只能說a的值是‘C’或者67.
想必你應(yīng)該能明白我想說什么了。
單引號是不能省去的,這一點尤其重要,缺少了單引號,它就不再是一個字符了。
這一點很容易忽略,尤其是選擇題,看到C這個選項,一激動就選上了。那就慘了。
變量類型的范圍計算問題
這里只提醒一點,計算范圍的時候不要忘記對于有符號的數(shù),有一位符號位。
字符串常量拼接問題
在C語言中是允許進行字符串拼接的。
也就是說,如果兩對引號包含的字符串放在一起,則會被解釋成一個字符串。
比如:
int main(){
char a[15]="hello""world";
char b[15]="hel""lo""world";
printf("%s",b);
return 0;
}
這兩個字符串都是合法的,且和“helloworld”等價。
數(shù)組相關(guān)
數(shù)組下標越界
這個……恐怕是個程序員都會出過的bug,從你初學(xué)編程語言到你退休。
考試也可能會出現(xiàn)這個問題,多半是在for循環(huán)里出現(xiàn)。
二維數(shù)組中行列計算問題
我們可能會經(jīng)常看到這樣的題,就是另一個指針等于二維數(shù)組中的某個地址單元,然后對指針進行加一之類的操作,然后問輸出的值。
而我們知道這里會有兩種不同的效果,一種是行計算,一種是列計算,二者的含義是,行計算,每次加一,地址會移動一行;而列計算,每次加一,地址只會移動一格。
比如:
int main(int argc,char *argv[]){
char a[3][4]={{"you"},{"I"},{"we"}};
char (*p)[4];
p=a;
printf("%s",*(p+1));
return 0;
}
這里輸出的就是第二個字符串I
具體的分類為:
| a | 計算行 |
| &a[0][0] | 計算列 |
| a[0] | 計算列 |
| *a | 計算列 |
字符數(shù)組賦值問題
我們知道我們可以這樣聲明一個字符數(shù)組:
char a[12]="helloworld!";但是,字符數(shù)組在被定義之后,是不被允許這樣直接賦值的。
比如下面這段代碼是不會通過編譯的:
a="helloworld!";
結(jié)構(gòu)體相關(guān)
結(jié)構(gòu)體所包含的變量不可初始化
這一點在C++中是被允許的,但是C中是不允許的。
所以習(xí)慣了寫C++的同學(xué)尤其需要注意。
不要忘記了。
查看結(jié)構(gòu)體內(nèi)部變量所占內(nèi)存大小
這里我們只舉個例子,比如我們有ABC這個結(jié)構(gòu)體,它有變量x,
則sizeof(((struct ABC*)0)->x)得到的就是x占用的內(nèi)存大小。
這里的0,只要是int型的量就可以。
庫函數(shù)相關(guān)
絕對值函數(shù)
注意math.h中有兩個絕對值函數(shù),一個是abs(),另一個是fabs()
其中前者是處理整型變量的,而后者是處理浮點型變量的
scanf()和printf()的返回值問題
我們通常會把它們當作輸入輸出語句使用,單獨成行,總是自動忽略它們的返回值,但其實它們是有返回值的。
那么它們的返回值是什么呢?
printf的返回值是輸出的數(shù)據(jù)個數(shù),而scanf的返回值則是讀入的數(shù)據(jù)個數(shù)。
我們可以來看個例題:
int main(){
int x;
printf("2:%d",printf("1:%d,",scanf("%d",&x)));
return 0;
}
請問它的輸出結(jié)果是什么?
答案是
1:1,2:4
為什么是4?不知道你是不是想這么問。
printf中所說的數(shù)據(jù)個數(shù),其實是把輸出的每個字符都看成一個單獨的數(shù)據(jù),也就是有多少字符加上我們傳入的數(shù)據(jù),就是它的返回值。
fclose()的返回值問題
和scanf、printf一樣,我們經(jīng)常忽略fclose的返回值,其實他也是有返回值的。
如果成功關(guān)閉流,那么返回0,如果未成功關(guān)閉則返回-1。
預(yù)編譯相關(guān)
注意宏定義的替換原則
我們知道宏定義實際上只是字符串的替換,并不是函數(shù)一樣的東西,所以我們在做題時也需要嚴格替換,替換完成之前,不要進行任何計算。
我們舉個例子:
答案是多少?54?那就錯了。實際上應(yīng)該是48.
這里我們不能把5+1算出來6再帶入,而是直接代入,這樣你就會發(fā)現(xiàn),5和1不是直接加在一起的。
免責(zé)聲明:本文系網(wǎng)絡(luò)轉(zhuǎn)載,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請我聯(lián)系,感謝!
往期推薦好文
★C語言編程工具的選擇?
★求1000以內(nèi)的水仙花數(shù)
★i++和++i有什么區(qū)別?
★「建議收藏」C語言編程判斷回文數(shù)
★看完你就明白:什么情況下該用int main(int argc, char *argv[])而不是int ????main(void)
★C語言編程:打印一個圓形
★福利:50本C語言電子書免費送了!
★C語言編程求解:1到1000之間所有的素數(shù)
★[必讀]C語言學(xué)習(xí)者常見問題及回答
總結(jié)
以上是生活随笔為你收集整理的asin c语言中 返回值范围_大学C语言考试易错知识点总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: zynq网络时钟控制寄存器_【干货分享】
- 下一篇: 以太网实习_物联网通信硬件入门项目—光纤