C語(yǔ)言復(fù)習(xí)易錯(cuò)點(diǎn)總結(jié)_第1頁(yè)
C語(yǔ)言復(fù)習(xí)易錯(cuò)點(diǎn)總結(jié)_第2頁(yè)
C語(yǔ)言復(fù)習(xí)易錯(cuò)點(diǎn)總結(jié)_第3頁(yè)
C語(yǔ)言復(fù)習(xí)易錯(cuò)點(diǎn)總結(jié)_第4頁(yè)
C語(yǔ)言復(fù)習(xí)易錯(cuò)點(diǎn)總結(jié)_第5頁(yè)
已閱讀5頁(yè),還剩1頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)1.1遞增(減)運(yùn)算符的表達(dá)式例如:i=3,a=(+i)+(+i)+(+i);大多數(shù)學(xué)生都知道i+和+i的最終結(jié)果都是使i的值加1,但i+和+i作為表達(dá)式的用途是不一樣的,+i是“先加后用”,i+是“先用后加”。上面的題目是“+”運(yùn)算符最典型的應(yīng)用,其中a的結(jié)果是18,而不是有些書上分析的4+5+6=15。因?yàn)樵谶@里要考慮運(yùn)算符的優(yōu)先級(jí),很顯然“+”的優(yōu)先級(jí)高于“+”。若是“i=3,a=(+i)+(+i)+(+i)”則a結(jié)果是9,而兩者最終的i值都將自增3即為6?!啊边\(yùn)

2、算符和“+”運(yùn)算符使用方式一樣,不再贅述。1.2輸入語(yǔ)句中缺取址符&例如:scanf(“%d”,x);這一語(yǔ)句錯(cuò)在x前缺取址符,導(dǎo)致輸入的數(shù)值沒(méi)有賦給變量x,所以結(jié)果出錯(cuò)。再如:char a10;scanf(“%s”,&a);有學(xué)生想,輸入語(yǔ)句的輸入變量前一定要加取址符,所以這個(gè)語(yǔ)句里加了取址符,肯定不會(huì)出錯(cuò)。而結(jié)果卻又恰恰錯(cuò)了,這是為什么呢?因?yàn)閍在這里既表示數(shù)組名字,又表示數(shù)組首地址,它本身已經(jīng)代表了地址,所以就不用再加取址符了。解決此類問(wèn)題的辦法就是在使用輸入語(yǔ)句的時(shí)候要仔細(xì)觀察,什么時(shí)候該加取地址符號(hào),什么時(shí)候不該加,一定要搞清楚。1.3邏輯運(yùn)算符&和位運(yùn)算符&相混淆例如:if(x&y

3、)編輯人員此判別條件的本意是將x和y的“與”(&)運(yùn)算結(jié)果作為條件。程序運(yùn)行時(shí),并不出錯(cuò),但是結(jié)果卻不對(duì)。原因是誤用按位“與”運(yùn)算符&替代了“與”運(yùn)算符&,這種錯(cuò)誤初學(xué)者很容易犯,但是又十分隱秘,在某些特殊情況下甚至可以得出正確的結(jié)果,所以更具有迷惑性。位運(yùn)算符是C語(yǔ)言獨(dú)特的一種運(yùn)算符,其中“&”表示對(duì)兩個(gè)操作數(shù)按二進(jìn)制位進(jìn)行“與”運(yùn)算,規(guī)則是:0&0=0,0&1=0,1&0=0,1&1=1。如6&5=4,其中6變?yōu)椋?變?yōu)?,按位“與”運(yùn)算的結(jié)果為100即4。1.4誤把賦值=當(dāng)恒等=例如:if(a=0)誤寫成if(a=0)。上述寫法將導(dǎo)致條件始終為假,進(jìn)入不了if語(yǔ)句條件為真的分支。編程的時(shí)候

4、要仔細(xì),要遵守c語(yǔ)言的語(yǔ)法規(guī)則。1.5條件語(yǔ)句(if)和循環(huán)條件語(yǔ)句后誤加分號(hào)例如:if(xy);x=y;這樣相當(dāng)于滿足條件執(zhí)行空語(yǔ)句。下面的x=y語(yǔ)句將被無(wú)條件執(zhí)行。一般情況下if()條件后不需要加分號(hào)。例如:for(i=1;i10;i+);上述for語(yǔ)句相當(dāng)于滿足條件執(zhí)行空語(yǔ)句,真正的循環(huán)語(yǔ)句則沒(méi)有被執(zhí)行。一般情況下for()循環(huán)條件后不需要加分號(hào)。這兩個(gè)都是初學(xué)者容易犯的錯(cuò)誤,又很難察覺(jué)出來(lái)。1.6循環(huán)語(yǔ)句中改變了循環(huán)變量的值例如:求水仙花數(shù)main() int i,a,b,c;for(i=100;i1000;i+) a=i%10;i=i/10;b=i%10;i=i/10;c=i%10;

5、/*i的值被改變*/if(a*a*a+b*b*b+c*c*c=i)printf(“%d”,i);此程序看起來(lái)思路非常正確,可是高度的時(shí)候就是死循環(huán),運(yùn)行不出結(jié)果。為什么呢?仔細(xì)觀察可知,在循環(huán)語(yǔ)句里,循環(huán)變量i每次進(jìn)入循環(huán)后都被改變了,導(dǎo)致了i永遠(yuǎn)都滿足循環(huán)條件,所以就死循環(huán)了。為了避免此類錯(cuò)誤,在編程時(shí)應(yīng)盡量避免在循環(huán)語(yǔ)句中改變循環(huán)變量。1.7作為輸出結(jié)果的變量沒(méi)有賦初值例如:求數(shù)組中的最大值能最大值的下標(biāo)main() int a10=8,2,3,4,5,6,3,7,max=a10,m,i;for (i=0; imax)max=ai; m=i;printf(“%d%d”,max,m); 程序

6、看似一點(diǎn)毛病都沒(méi)有,上機(jī)調(diào)試也都通過(guò),但是結(jié)果卻不對(duì)。原因就在下標(biāo)變量m沒(méi)有賦初值,系統(tǒng)隨機(jī)賦了初值,導(dǎo)致結(jié)果錯(cuò)誤。給m賦初值0就可以了。1.8初值賦了,但是賦的位置不對(duì)例如:求100以內(nèi)的完數(shù)s=0;for(i=1;i=100;i+) for(j=1;j=i/2;j+) if(i%j=0) s+=j; if(s=i) printf(“%d”,i);是不是這樣每一次循環(huán)s都變了? 程序運(yùn)行的結(jié)果預(yù)期是6和28,可是實(shí)際上卻沒(méi)有任何結(jié)果。原因就是s=0這個(gè)語(yǔ)句放錯(cuò)了位置,應(yīng)該放在外層循環(huán)里面,也就是每判斷一個(gè)數(shù)都應(yīng)該從0開(kāi)始累加。再如:求1!+2!+100!main() int i,j,s=0,

7、t=1;for(i=1;i=100;i+) for(j=1;j=i;j+) t=t*j;s+=t; printf(“%d”,s);t=1應(yīng)該放在第三行此程序看似正確,可是運(yùn)行結(jié)果卻不對(duì),原因也是在t=1這個(gè)賦值語(yǔ)句,它的位置應(yīng)該在外層循環(huán)的里面,而不是在外面。這種錯(cuò)誤,對(duì)于初學(xué)者來(lái)講,很容易犯,卻又發(fā)現(xiàn)不了,在程序調(diào)試的時(shí)候會(huì)浪費(fèi)很多時(shí)間,又會(huì)影響編程的自信心。1.9數(shù)組和整型或者實(shí)型變量不能重名例如:main() int a10,a;數(shù)組名為a,其他變量的名字就不能再用a。1.10數(shù)組輸出時(shí)的錯(cuò)誤例如:現(xiàn)在想輸出數(shù)組a中的所有數(shù)值。int a10=1,2,3,4,5,6,i;for(i=0;

8、i10;i+)printf(“%d”,a10);這個(gè)程序看似輸出數(shù)組的十個(gè)元素,其實(shí)只輸出其中的一個(gè)元素。解決此類問(wèn)題的辦法是大家要理解數(shù)組下標(biāo)和循環(huán)變量的關(guān)系。再如:int a10=1,2,3,4,5,6,i;for(i=0;ib)這一段代碼的本意是比較字符串a(chǎn)和字符串b的大小,但是這樣比較是不正確的,應(yīng)該改成 if(strcmp(a,b)0)解決這類問(wèn)題關(guān)鍵是要記住字符數(shù)組名字代表的是字符數(shù)組的地址,是常量,不能直接進(jìn)行復(fù)制等操作。這是個(gè)容易忽視的地方,也是考試經(jīng)常出題的地方,希望引起大家的注意。1.13函數(shù)調(diào)用時(shí)參數(shù)傳遞出錯(cuò)例如:void swap(int a,int b) int t;

9、t=a;a=b;b=t;此段代碼的本意是一個(gè)交換兩個(gè)變量值的函數(shù),但實(shí)際上這個(gè)函數(shù)完不成這個(gè)功能,因?yàn)楸竞瘮?shù)傳遞的是數(shù)值,函數(shù)調(diào)用時(shí)傳遞數(shù)值只是對(duì)實(shí)際參數(shù)值的一個(gè)拷貝,并不能改變實(shí)際參數(shù)的值,要完成此功能必須傳入地址。因此上例應(yīng)該為:void swap(int *a,int *b) int t;t=*a;*a=*b;*b=t;1.14忘記加頭文件例如:求1-1/3+1/5-1/7,求此序列的和,直到最后一項(xiàng)的絕對(duì)值小于1e-6為止。程序如下:main() double s=0,x=1;long k=1;int flag=1;while(fabs(x)1e-6)s+=x;k+=2;flag=-f

10、lag;x=flag/k; 學(xué)生在調(diào)試這個(gè)程序時(shí),未發(fā)現(xiàn)錯(cuò)誤,可就是結(jié)果運(yùn)行不出來(lái)。其實(shí)程序是沒(méi)有任何錯(cuò)誤。解決此類問(wèn)題的辦法就是要在程序的前面加上一個(gè)頭文件#include“math.h”,如果不加這個(gè)頭文件的話,系統(tǒng)將不認(rèn)識(shí)fabs這個(gè)函數(shù)。1.15函數(shù)定義中未聲明形參類型這種情況下調(diào)用函數(shù),系統(tǒng)默認(rèn)把其處理為整型參數(shù),若沒(méi)有聲明函數(shù)的類型,返回值也為整型。調(diào)用時(shí)所有參數(shù)以整型傳遞,會(huì)出現(xiàn)參數(shù)不匹配的情況。解決辦法就是明確定義函數(shù)參數(shù)的類型和個(gè)數(shù)。2教學(xué)建議結(jié)合實(shí)際教學(xué)過(guò)程中出現(xiàn)的問(wèn)題,我們認(rèn)為教師可以向?qū)W生提出幾點(diǎn)建議:(1) C語(yǔ)言編程是一個(gè)循序漸進(jìn)的過(guò)程。不要好高騖遠(yuǎn),一開(kāi)始學(xué),就想

11、編寫那些很復(fù)雜很大的程序,這是不切合實(shí)際,要踏踏實(shí)實(shí)打基礎(chǔ)。(2) C語(yǔ)言一定要仔細(xì),不能毛毛草草,該寫逗號(hào)的地方,就不能寫成分號(hào)。(3) 學(xué)習(xí)C語(yǔ)言的過(guò)程中,要善于總結(jié)、積累。一是積累一些編程的方法、思想,下次再遇到類似的問(wèn)題,就會(huì)有思路。二是要積累編程過(guò)程中遇到的錯(cuò)誤,最好準(zhǔn)備一個(gè)小本子,把它記錄下來(lái)。下次再遇到這樣的問(wèn)題,就會(huì)解決了,這樣會(huì)節(jié)省很多時(shí)間。1. 關(guān)于條件表達(dá)式。形如:邏輯表達(dá)式? 表達(dá)式1 : 表達(dá)式2。邏輯表達(dá)式的值若為非零(真),則條件表達(dá)式的值等于表達(dá)式1,若邏輯表達(dá)值的值為零(假),則條件表達(dá)式的值等于表達(dá)式2的值。特別要注意的是條件表達(dá)式的結(jié)合方向是從右向左結(jié)合的

12、。例:與 y=(x0?1:x0) y=1; else if(x0?1:x0?1:(x5) printf(%d,x); else printf(%dn,x-);8. 各類運(yùn)算符的優(yōu)先級(jí)別:詳細(xì)請(qǐng)看譚老的C程序設(shè)計(jì)(第二版)的P375頁(yè)。初等運(yùn)算符(括號(hào)加結(jié)構(gòu)體運(yùn)算符)單目運(yùn)算符(注意邏輯非運(yùn)算符! 它是除初等運(yùn)算符外具有最高優(yōu)先級(jí)別的)算術(shù)運(yùn)算符(先乘除模,后加減,再移位)關(guān)系運(yùn)算符邏輯運(yùn)算符(& ,| ,不包括 ! )條件運(yùn)算符(唯一一個(gè)三目運(yùn)算符,即 ? : )賦值運(yùn)算符逗號(hào)運(yùn)算符(即順序求值運(yùn)算符)例:以下十個(gè)運(yùn)算符+ ! != , ?: & = | %中優(yōu)先級(jí)別最高和最低的分別是_!_和

13、_,_。9. static的作用。l 一是其聲明的局部變量為靜態(tài)局部變量,靜態(tài)局部變量的值在程序整個(gè)運(yùn)行期間不釋放,即下次調(diào)用該函數(shù)時(shí)其值仍保留;其如果在編譯時(shí)賦初值的,只賦值一次;不賦初值的,編譯器自動(dòng)賦值為0(數(shù)字型)或空字符(字符型);雖然靜態(tài)局部變量在函數(shù)調(diào)用結(jié)束后仍存放,但外部的程序仍然不能引用。l 二是其聲明的外部變量為靜態(tài)外部變量,只能用于本文件,即使其他文件用了extern仍不能引用。10. 十進(jìn)制(一般的數(shù)字序列),八進(jìn)制(以0開(kāi)頭的數(shù)字序列,字符用ddd賦值),十六進(jìn)制(以0 x開(kāi)頭的數(shù)字序列,字符用xhh賦值)。另外1.5e-2表示1.5*10-2或者0.015。例:設(shè)有

14、以下語(yǔ)句: char c;c=x1C;則C的二進(jìn)制的值是_C_A) B) C) D) 解:c=x1C;是指以十六進(jìn)制的形式給字符c賦值,其相當(dāng)于c=28;所以轉(zhuǎn)換為二進(jìn)制即11100。11. 定義結(jié)構(gòu)體與typedef的代碼:struct people / people是結(jié)構(gòu)體名 char name10; / 成員列表 int age; float height; double weight; / 分號(hào)千萬(wàn)不能漏typedef struct people SP; / 用typedef方式定義新的類型名SP,方便些/-/ 也可以寫成這樣typedef struct people char nam

15、e10; int age; float height; double weight;SP;12. 判別幾個(gè)容易混淆語(yǔ)句的異同。異同都在我的腦海里,懶得打出來(lái)了,希望你自己想想,然后可以印在你腦海里。break與continuewhile,dowhile與forifelse ifelse與switchcasedefaultdefine與typedef13. int *p4與int (*p)4的異同。l int *p4表示p是指針數(shù)組。由于比*優(yōu)先級(jí)高,因此p先與4結(jié)合,形成p4形式,這顯然是數(shù)組形式,它有4個(gè)元素。然后再與p前面的“*”結(jié)合,“*”表示此數(shù)組是指針類型的,每個(gè)數(shù)組元素(相當(dāng)于一個(gè)

16、指針變量)都可指向一個(gè)整型變量。l int (*p)4表示p是一個(gè)指針變量。它有4個(gè)元素,每個(gè)元素為整型。也就是p所指的對(duì)象是有4個(gè)整型元素的數(shù)組,即p是行指針。應(yīng)該記住,此時(shí)p只能指向一個(gè)包含4個(gè)元素的一維數(shù)組,p的值就是該一維數(shù)組的首地址。p不能指向一維數(shù)組中的第j個(gè)元素。14. *p+與*(+p),*(p+)與*(+p),還有 (*p)+l *p+與*(+p)作用不同。前者是先取*p值,后使p的指針值加1。后者是先使p的指針值加1,再取*p值。l 若p初值為a(即&a0),輸出*(p+)時(shí),得a0的值,而輸出*(+p),則得到a1的值。l (*p)+表示p所指向的元素值加1,即(a0)+

17、,如果a0=3,則(a0)+的值為4。注意:是元素值加1,而不是指針值加1。15. 若有定義int asizesize;l 請(qǐng)記住*(a+i)和a i 是等價(jià)的。l *(a i +j)、*(*(a+i)+j)都是二維數(shù)組元素a i j的值。有人可能會(huì)問(wèn)“a+1的值和a+1的地址怎么會(huì)是一樣的呢”?其實(shí),a+1是地址(指向第1行首地址),而*(a+1)并不是“a+1單元的內(nèi)容(值)”,因?yàn)閍+1并不是一個(gè)實(shí)際變量,也就談不上它的內(nèi)容。*(a+1)就是a1,而a1是一維數(shù)組名,所以也是地址。以上各種形式都是地址計(jì)算的不同表示。l a,a0的值雖然相同,但是由于指針的類型不同(a是指向一維數(shù)組,a0指向a00元素)因此,對(duì)這些指針進(jìn)行加1的運(yùn)算,得到的結(jié)果是不同的。請(qǐng)記住,二維數(shù)組名(如a)是指向行的。因此a+1中的“1”代表一行中全部元素所占的字節(jié)數(shù)。一維數(shù)組名(如a0,a1)是指向列元素的。a0+1中的“1”代表一個(gè)元素所占的字節(jié)數(shù)。在行指針前面加一個(gè)*,就轉(zhuǎn)換為列指針。例如,a和a+1是行指針,在它們前面加一個(gè)*就是*a和*(a+1) ,它們就成為列指針,分別指向a數(shù)組0行

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論