国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

初學(xué)者學(xué)習(xí)C語言中常見問題的探討

2014-07-18 18:54:25霍卓群
電腦知識與技術(shù) 2014年13期
關(guān)鍵詞:常見錯誤初學(xué)者解決方法

霍卓群

摘要:C語言是編程領(lǐng)域中很有影響力的一種程序設(shè)計(jì)語言。它簡潔、緊湊,使用方便、靈活,并且具備高級語言和低級語言的特征。由于C語言的編譯系統(tǒng)對語法的檢查不如其他語言那么嚴(yán)格,因此C語言對使用者的要求比較高.筆者結(jié)合實(shí)際教學(xué)中的經(jīng)驗(yàn),分類列舉出C語言中常見的錯誤進(jìn)行分析與探討,以此對初學(xué)者給予借鑒。

關(guān)鍵詞: C語言; 初學(xué)者; 常見錯誤; 解決方法

中圖分類號:TP311 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2014)13-3012-04

Study of Common Problems in C Language Beginners

HUO Zhuo-qun

(Lecturer of Electronic Information Department of Anhui Finance and Trade Vocational College,Hefei 230601, China)

Abstract: C language is a very influential programming language in the field . It is concise, compact, easy, flexible, and has both the characteristics of high and low level languages. Because the examine of grammer by the compiling system of C language is not as strict as others ,it has higher standard for its users . Combined with my teaching experience, I list common mistakes in C language,then analysis and discuss, hoping helpful for beginners.

Key words: C language; beginner; common errors; solution

在計(jì)算機(jī)教育方面,C語言是為數(shù)不多的國內(nèi)外能同步的程序設(shè)計(jì)語言之一,可見,它在高校理工類專業(yè)基礎(chǔ)課程中的重要地位。對于剛進(jìn)入大學(xué)生活的學(xué)生們,開始學(xué)習(xí)C語言課程,會感覺C語言的知識點(diǎn)多、理論性強(qiáng)、具有嚴(yán)密的邏輯性,學(xué)習(xí)難度較大。授課教師在課堂教學(xué)和實(shí)訓(xùn)環(huán)節(jié)中,發(fā)現(xiàn)學(xué)生們常易出現(xiàn)許多同性的問題,而這些或多或少的問題給學(xué)生們帶來了很大的麻煩,甚至產(chǎn)生較強(qiáng)的挫敗感。該文結(jié)合了筆者多年C語言教學(xué)經(jīng)驗(yàn),將常見問題進(jìn)行分析與探討。如下將以“陷阱”分類闡述,重點(diǎn)讓初學(xué)者能夠通過具體示例,吸取他人所犯錯誤的經(jīng)驗(yàn)教訓(xùn)。

1 詞法“陷阱”

試想下,當(dāng)我們閱讀一個(gè)句子時(shí),我們并不去考慮組成這個(gè)句子的單詞中單個(gè)字母的含義,而是會把單詞作為一個(gè)整體來理解。的確,字母本身并沒有什么意義,而是我們將字母組成單詞,然后給單詞賦予一定的意義。對于C語言編寫程序,也是一樣的道理。

“符號”是程序的一個(gè)基本組成單位,作用相當(dāng)于一個(gè)句子中的單詞。如下將討論符號以及符號間的一些常見問題。

1.1 “=”不同于“==”

在C語言中,符號“=”為賦值運(yùn)算符,符號“==”為比較運(yùn)算符。一般的,賦值運(yùn)算相對于比較運(yùn)算出現(xiàn)得更頻繁,以此字符數(shù)較少的“=”被賦予了賦值運(yùn)算的含義。學(xué)生在程序設(shè)計(jì)中,往往本意想用作比較運(yùn)算,卻可能無意中誤寫成賦值運(yùn)算。如示例1:

main()

{ inta,b; scanf("%d%d",&a,&b);

if(a=b) printf("a,b相等\n");

else printf("a,b不相等\n");}

執(zhí)行程序時(shí)會發(fā)現(xiàn)即使輸入a,b的值不相同,輸出結(jié)果仍然是“a,b相等”。此問題的原因就在于if中的條件誤將賦值運(yùn)算符“==”寫成了比較運(yùn)算符“=”。

1.2 “x

在c語言中關(guān)系運(yùn)算符號與數(shù)學(xué)中接觸到的比較符號,從使用方式和能夠都很相似,所以誤將兩者完全等價(jià)。

如示例2:

main()

{ inta,b,c;scanf("%d%d%d",&a,&b,&c);

if(a>b>c) printf("a最大\n");

if(b>a>c) printf("b最大\n");

if(c>b>a) printf("c最大\n");}

執(zhí)行程序時(shí),輸入“1 2 3”或“3 2 1”,沒有輸出結(jié)果。此問題在于對“a>b>c”關(guān)系運(yùn)算符應(yīng)用的誤解。比如:輸入“1 2 3”,分析“if(c>b>a)”的結(jié)果,由于關(guān)系符“>”的結(jié)合性自左向右,即“3>2”比較的結(jié)果為“真”。在C語言關(guān)系運(yùn)算中,以“1”代表“真”,以“0”代表“假”,所以最終比較的是“1>1”,自然運(yùn)算結(jié)果為“假”,也就不會出現(xiàn)預(yù)期的輸出“c最大”。因此,正確代碼應(yīng)將三段條件結(jié)構(gòu)依次修改為:if(a>b&&a>c)、if(b>a&&b>c)、if(c>b&&c>a)。

1.3 scanf()函數(shù)的幾點(diǎn)注意問題

1.3.1輸入數(shù)據(jù)的方式與要求不符

因 C語言規(guī)定:如果在“格式控制”字符串中除了格式說明以外還有其它字符則在輸入數(shù)據(jù)時(shí)應(yīng)輸入與這些字符相同的字符。

比如:scanf("%d,%d",&a,&b);

輸入時(shí),如果用空格作兩個(gè)數(shù)據(jù)間的分隔符輸入: 4 5,則不合法。

合法的輸入形式應(yīng)是: 4,5

再如:scanf("a=%d,b=%d",&a,&b);

正確的輸入形式應(yīng)是:a=3,b=4

1.3.2輸入數(shù)據(jù)中的空格和回車

scanf()函數(shù),在用“%c”格式聲明輸入字符時(shí),有不同于其他格式類型需注意的地方。字符格式類型中,空格符、轉(zhuǎn)義字符都作為有效字符;而對于數(shù)值型數(shù)據(jù),空格符、回車鍵、Tab鍵或非法數(shù)值字符均認(rèn)為數(shù)值字符輸入的終止符。

如下示例3:

main()

{char c1,c2;int d1,d2;

scanf("%c%c",&c1,&c2);

scanf("%d%d",&d1,&d2);

printf("c1=%c,c2=%c\n",c1,c2);

printf("d1=%d,d2=%d\n",d1,d2);}

輸入:

ab

123 45

輸出:

c1=a,c2=b

d1=123,d2=45

輸入:

a b

12345 78

輸出:

c1=a,c2=

d1=12345,d2=78

如下示例4:

main()

{ chargender,ms;

printf("請輸入性別(f/m)\n");

scanf("%c",&gender);

printf("請輸入婚姻狀況(y/n)\n");

scanf("%c",&ms);

printf("性別是:%c,婚姻狀況:%c\n",gender,ms); }

執(zhí)行時(shí)輸入“f”,結(jié)果沒有等輸入(y/n)就顯示結(jié)果如下圖1。

不難發(fā)現(xiàn)字符變量ms得到的字符為“回車”,即輸入“f”后用戶敲入的“回車鍵”。如何避免此種現(xiàn)象的產(chǎn)生,可以采取以下幾種方法。

方法一:規(guī)避編譯器誤將回車鍵作為字符存儲至字符變量ms中,可以使用scanf("\n%c",&ms);

方法二:在兩次輸入語句中間加入清除緩沖流的語句,fflush(stdin);

改進(jìn)后,正確執(zhí)行結(jié)果如圖2。

圖1 示例4運(yùn)行錯誤結(jié)果圖 圖2 示例4-2運(yùn)行正確結(jié)果圖

1.4 字符與字符串

C語言中,單引號和雙引號含義迥異,在某些情況下如果把兩者弄混,編譯器并不會檢測報(bào)錯,從而在運(yùn)行時(shí)會產(chǎn)生難以預(yù)料的結(jié)果。

用單引號引起來的一個(gè)字符實(shí)際上代表一個(gè)整數(shù),整數(shù)值對應(yīng)該字符在編譯器采用字符集中的序列集。用雙引號引起來的字符串,代表著一個(gè)指向無名數(shù)組起始字符的指針,該數(shù)組被雙引號之間的字符以及一個(gè)空字符\0初始化。具體不同,如下示例5:

main()

{ printf("\n"); printf("'\n'"); printf("'\101'");}

運(yùn)行結(jié)果如下圖3,如果語句換成 printf('\n');雖編譯時(shí)沒有異常,但運(yùn)行時(shí)應(yīng)用程序錯誤,具體問題如圖4。

圖3 示例5運(yùn)行結(jié)果圖 圖4 示例5錯誤截圖

2 語法“陷阱”

要理解一個(gè)C程序,僅僅理解組成該程序的符號是不夠的。初學(xué)者還必須理解這些符號是如何組成表達(dá)式、語句和程序的,有時(shí)候這些定義和直覺相悖,容易引起混淆。下面就討論一些容易產(chǎn)生問題的語法結(jié)構(gòu)。

2.1 語句結(jié)束符:分號的使用

在C程序中如果不小心多寫了一個(gè)分號可能不會造成不良后果,因?yàn)檫@實(shí)際上產(chǎn)生一個(gè)空語句。但是也有重要的例外,在if或者while子句之后需要緊跟一條語句時(shí),如果此時(shí)多加了一個(gè)分號,就會產(chǎn)生出人意料的結(jié)果。示例6:

main()

{ int x=2;

if(x>2)

printf("x>2");}

程序運(yùn)行結(jié)果沒有輸出。但如果if(x>2)條件后面加上分號,則輸出“x>2”。同樣的道理,如下,正常輸出結(jié)果為“543”;而如果while子句后加上分號,此程序變成了“死循環(huán)”。示例7:

main()

{ int x=5;

while(x>2)

{ printf("%d",x);

x—; }}

2.2 switch語句

C語言的switch語句控制流能夠依次通過并執(zhí)行各個(gè)case部分,這一點(diǎn)是C語言的不同之處。如下分析有無“break”語句的效果,示例8:

main()

{ int color=1;

switch(color)

{ case 1: printf("red");break;

case 2: printf("blue");break;

case 3: printf("yellow");break; }}

程序運(yùn)行結(jié)果為:red。如果將程序中三個(gè)“break”全部刪除,程序運(yùn)行結(jié)果為:redblueyellow。原因是C語言中的switch語句在執(zhí)行了控制流程中的第一個(gè)之后,會自然而然地順序執(zhí)行下去,直到最后一個(gè)case語句。

實(shí)際中,C語言中switch語句的這種特性,既是它的優(yōu)點(diǎn),又是它的一大弱點(diǎn)。說到弱點(diǎn)是因?yàn)槌鯇W(xué)者很容易遺漏各個(gè)case后面的break語句,造成難以理解的程序結(jié)果。說到優(yōu)勢是因?yàn)楫?dāng)程序員有意的略去一個(gè)break語句,則可以實(shí)現(xiàn)多個(gè)分支共同作用處理,重要的是看程序員如何應(yīng)用。

2.3 else“懸掛”引發(fā)的問題

此問題是大多數(shù)初學(xué)者很容易弄錯,而且并非C語言獨(dú)有,其他語言也會讓程序員們常常失誤。在應(yīng)用多支路的程序設(shè)計(jì)中,往往會用到if的嵌套結(jié)構(gòu),常常容易出現(xiàn)錯誤。

如實(shí)現(xiàn)如下的分段函數(shù)。程序代碼示例9:

int main()

{ int x,y;

scanf("%d",&x);

y=0;

if(x>=0)

if(x>0)

y=5;

else

y=-5;

printf("y=%d\n",y);}

如上代碼在執(zhí)行測試時(shí)會發(fā)現(xiàn)實(shí)際輸出結(jié)果與編程者的愿望相去甚遠(yuǎn)。原因在于C語言中有這樣的規(guī)則,else總是與同一對括號內(nèi)最近的缺少對于else部分的if結(jié)合匹配。也就是說,并不單單是x<0時(shí)y=-5,還包括x=0時(shí)y=-5。

故該問題用添加括號的辦法,改為正確程序部分代碼如下:

if(x>=0)

{if(x>0) y=5;}

else y=-5;

此時(shí),else并沒有同離它更近的第二個(gè)if匹配,而是與第一個(gè)if結(jié)合,因?yàn)榈诙€(gè)if已經(jīng)被括號“封閉”起來了,構(gòu)成了if的嵌套結(jié)構(gòu)。

3 語義“陷阱”

3.1整數(shù)溢出

C語言提供的數(shù)據(jù)類型有許多,其中整型數(shù)據(jù)提供了三種不同長度的類別:short int、int和long int。不管是哪種數(shù)據(jù)類型都有一個(gè)固定的長度,它能存儲的最大值是一個(gè)固定的整數(shù),當(dāng)嘗試去存儲一個(gè)大于這個(gè)固定最大值時(shí),將會導(dǎo)致整數(shù)溢出.

例如:求滿足條件1+2+3+…+n≤32767的最大整數(shù)n,如下實(shí)例10:

main()

{int n=1,sum=0;

while(sum<=32767) {sum+=n; n++;}

printf(“n=%d\n”,n-1);}

乍看該程序時(shí)無錯誤,但事實(shí)上,上列程序中的while循環(huán)是一個(gè)無限循環(huán),原因在于int型數(shù)的表示范圍為-32768到+32767,當(dāng)累加和sum超過32767時(shí),便向高位進(jìn)位,而對int型數(shù)而言,最高位表示符號,故sum超過32767后便得到一個(gè)負(fù)數(shù),while條件當(dāng)然滿足,從而形成無限循環(huán)。解決此類問題是將數(shù)據(jù)容量升高,sum定義為long int型。

3.2求值順序

可能說起求值順序,許多人能聯(lián)想到運(yùn)算符的優(yōu)先級問題,但其實(shí)這不是一回事。運(yùn)算符優(yōu)先級是諸如:a+b*c等同于a+(b*c);而求值順序是諸如:if(n!=0&&x/n>y),此時(shí)即使n=0時(shí),也不會出現(xiàn)“0作為除數(shù)”的錯誤。原因就是因?yàn)楫?dāng)n=0時(shí),n!=0的表達(dá)式為0,不會再運(yùn)算到后面的表達(dá)式。

C語言中某些運(yùn)算符總是以一種已知的、規(guī)定的順序來對其操作數(shù)進(jìn)行求值,而另外一些則不是這樣的。再如:a

C語言中只有四個(gè)運(yùn)算符(&&、||、?: 、 ,)存在規(guī)定的求值順序。邏輯運(yùn)算符“&&”和“||”首先對左操作數(shù)求值,只在需要時(shí)才對右側(cè)操作數(shù)求值。運(yùn)算符“?:”是三元運(yùn)算符,在a?b:c中,首先對操作數(shù)a進(jìn)行判斷,再確定求b還是c。如:1>2?3:4,由于1>2結(jié)果為假,則最終表達(dá)式值為4。而逗號運(yùn)算符,首先對左側(cè)操作數(shù)求值,然后該值被“丟棄”,再對右側(cè)操作數(shù)求值。如:a=1,2,3;最終a的值為3。

4 總結(jié)

本文筆者通過多年的教學(xué)經(jīng)驗(yàn)總結(jié)出一些應(yīng)用性實(shí)例,針對初學(xué)者在學(xué)習(xí)C語言時(shí)易犯的錯誤,分類討論后給予錯誤分析,并提出相應(yīng)的解決方案。如想熟練掌握C語言,需要學(xué)生們不斷地總結(jié)分析,大量的上機(jī)實(shí)踐,這樣才能積累更多的程序設(shè)計(jì)經(jīng)驗(yàn)。

參考文獻(xiàn):

[1] 張悅. 一種基于程序結(jié)構(gòu)的程序主變元分析與確定方法研究[D].北京:北京化工大學(xué),2008.

[2] 常鑫.C語言程序設(shè)計(jì)的輸入輸出[J]. 內(nèi)蒙古科技與經(jīng)濟(jì),2012(1).

[3] 雷萌. C語言疑惑經(jīng)驗(yàn)談[J].軟件導(dǎo)刊,2011(3).

[4] 朱一峰.C語言常見錯誤分析及解決方法[J].遼寧師專學(xué)報(bào),2009,11(4).

[5] 張海燕.C語言學(xué)習(xí)中的難點(diǎn)淺析[J].科技資訊,2008(29).

實(shí)際中,C語言中switch語句的這種特性,既是它的優(yōu)點(diǎn),又是它的一大弱點(diǎn)。說到弱點(diǎn)是因?yàn)槌鯇W(xué)者很容易遺漏各個(gè)case后面的break語句,造成難以理解的程序結(jié)果。說到優(yōu)勢是因?yàn)楫?dāng)程序員有意的略去一個(gè)break語句,則可以實(shí)現(xiàn)多個(gè)分支共同作用處理,重要的是看程序員如何應(yīng)用。

2.3 else“懸掛”引發(fā)的問題

此問題是大多數(shù)初學(xué)者很容易弄錯,而且并非C語言獨(dú)有,其他語言也會讓程序員們常常失誤。在應(yīng)用多支路的程序設(shè)計(jì)中,往往會用到if的嵌套結(jié)構(gòu),常常容易出現(xiàn)錯誤。

如實(shí)現(xiàn)如下的分段函數(shù)。程序代碼示例9:

int main()

{ int x,y;

scanf("%d",&x);

y=0;

if(x>=0)

if(x>0)

y=5;

else

y=-5;

printf("y=%d\n",y);}

如上代碼在執(zhí)行測試時(shí)會發(fā)現(xiàn)實(shí)際輸出結(jié)果與編程者的愿望相去甚遠(yuǎn)。原因在于C語言中有這樣的規(guī)則,else總是與同一對括號內(nèi)最近的缺少對于else部分的if結(jié)合匹配。也就是說,并不單單是x<0時(shí)y=-5,還包括x=0時(shí)y=-5。

故該問題用添加括號的辦法,改為正確程序部分代碼如下:

if(x>=0)

{if(x>0) y=5;}

else y=-5;

此時(shí),else并沒有同離它更近的第二個(gè)if匹配,而是與第一個(gè)if結(jié)合,因?yàn)榈诙€(gè)if已經(jīng)被括號“封閉”起來了,構(gòu)成了if的嵌套結(jié)構(gòu)。

3 語義“陷阱”

3.1整數(shù)溢出

C語言提供的數(shù)據(jù)類型有許多,其中整型數(shù)據(jù)提供了三種不同長度的類別:short int、int和long int。不管是哪種數(shù)據(jù)類型都有一個(gè)固定的長度,它能存儲的最大值是一個(gè)固定的整數(shù),當(dāng)嘗試去存儲一個(gè)大于這個(gè)固定最大值時(shí),將會導(dǎo)致整數(shù)溢出.

例如:求滿足條件1+2+3+…+n≤32767的最大整數(shù)n,如下實(shí)例10:

main()

{int n=1,sum=0;

while(sum<=32767) {sum+=n; n++;}

printf(“n=%d\n”,n-1);}

乍看該程序時(shí)無錯誤,但事實(shí)上,上列程序中的while循環(huán)是一個(gè)無限循環(huán),原因在于int型數(shù)的表示范圍為-32768到+32767,當(dāng)累加和sum超過32767時(shí),便向高位進(jìn)位,而對int型數(shù)而言,最高位表示符號,故sum超過32767后便得到一個(gè)負(fù)數(shù),while條件當(dāng)然滿足,從而形成無限循環(huán)。解決此類問題是將數(shù)據(jù)容量升高,sum定義為long int型。

3.2求值順序

可能說起求值順序,許多人能聯(lián)想到運(yùn)算符的優(yōu)先級問題,但其實(shí)這不是一回事。運(yùn)算符優(yōu)先級是諸如:a+b*c等同于a+(b*c);而求值順序是諸如:if(n!=0&&x/n>y),此時(shí)即使n=0時(shí),也不會出現(xiàn)“0作為除數(shù)”的錯誤。原因就是因?yàn)楫?dāng)n=0時(shí),n!=0的表達(dá)式為0,不會再運(yùn)算到后面的表達(dá)式。

C語言中某些運(yùn)算符總是以一種已知的、規(guī)定的順序來對其操作數(shù)進(jìn)行求值,而另外一些則不是這樣的。再如:a

C語言中只有四個(gè)運(yùn)算符(&&、||、?: 、 ,)存在規(guī)定的求值順序。邏輯運(yùn)算符“&&”和“||”首先對左操作數(shù)求值,只在需要時(shí)才對右側(cè)操作數(shù)求值。運(yùn)算符“?:”是三元運(yùn)算符,在a?b:c中,首先對操作數(shù)a進(jìn)行判斷,再確定求b還是c。如:1>2?3:4,由于1>2結(jié)果為假,則最終表達(dá)式值為4。而逗號運(yùn)算符,首先對左側(cè)操作數(shù)求值,然后該值被“丟棄”,再對右側(cè)操作數(shù)求值。如:a=1,2,3;最終a的值為3。

4 總結(jié)

本文筆者通過多年的教學(xué)經(jīng)驗(yàn)總結(jié)出一些應(yīng)用性實(shí)例,針對初學(xué)者在學(xué)習(xí)C語言時(shí)易犯的錯誤,分類討論后給予錯誤分析,并提出相應(yīng)的解決方案。如想熟練掌握C語言,需要學(xué)生們不斷地總結(jié)分析,大量的上機(jī)實(shí)踐,這樣才能積累更多的程序設(shè)計(jì)經(jīng)驗(yàn)。

參考文獻(xiàn):

[1] 張悅. 一種基于程序結(jié)構(gòu)的程序主變元分析與確定方法研究[D].北京:北京化工大學(xué),2008.

[2] 常鑫.C語言程序設(shè)計(jì)的輸入輸出[J]. 內(nèi)蒙古科技與經(jīng)濟(jì),2012(1).

[3] 雷萌. C語言疑惑經(jīng)驗(yàn)談[J].軟件導(dǎo)刊,2011(3).

[4] 朱一峰.C語言常見錯誤分析及解決方法[J].遼寧師專學(xué)報(bào),2009,11(4).

[5] 張海燕.C語言學(xué)習(xí)中的難點(diǎn)淺析[J].科技資訊,2008(29).

實(shí)際中,C語言中switch語句的這種特性,既是它的優(yōu)點(diǎn),又是它的一大弱點(diǎn)。說到弱點(diǎn)是因?yàn)槌鯇W(xué)者很容易遺漏各個(gè)case后面的break語句,造成難以理解的程序結(jié)果。說到優(yōu)勢是因?yàn)楫?dāng)程序員有意的略去一個(gè)break語句,則可以實(shí)現(xiàn)多個(gè)分支共同作用處理,重要的是看程序員如何應(yīng)用。

2.3 else“懸掛”引發(fā)的問題

此問題是大多數(shù)初學(xué)者很容易弄錯,而且并非C語言獨(dú)有,其他語言也會讓程序員們常常失誤。在應(yīng)用多支路的程序設(shè)計(jì)中,往往會用到if的嵌套結(jié)構(gòu),常常容易出現(xiàn)錯誤。

如實(shí)現(xiàn)如下的分段函數(shù)。程序代碼示例9:

int main()

{ int x,y;

scanf("%d",&x);

y=0;

if(x>=0)

if(x>0)

y=5;

else

y=-5;

printf("y=%d\n",y);}

如上代碼在執(zhí)行測試時(shí)會發(fā)現(xiàn)實(shí)際輸出結(jié)果與編程者的愿望相去甚遠(yuǎn)。原因在于C語言中有這樣的規(guī)則,else總是與同一對括號內(nèi)最近的缺少對于else部分的if結(jié)合匹配。也就是說,并不單單是x<0時(shí)y=-5,還包括x=0時(shí)y=-5。

故該問題用添加括號的辦法,改為正確程序部分代碼如下:

if(x>=0)

{if(x>0) y=5;}

else y=-5;

此時(shí),else并沒有同離它更近的第二個(gè)if匹配,而是與第一個(gè)if結(jié)合,因?yàn)榈诙€(gè)if已經(jīng)被括號“封閉”起來了,構(gòu)成了if的嵌套結(jié)構(gòu)。

3 語義“陷阱”

3.1整數(shù)溢出

C語言提供的數(shù)據(jù)類型有許多,其中整型數(shù)據(jù)提供了三種不同長度的類別:short int、int和long int。不管是哪種數(shù)據(jù)類型都有一個(gè)固定的長度,它能存儲的最大值是一個(gè)固定的整數(shù),當(dāng)嘗試去存儲一個(gè)大于這個(gè)固定最大值時(shí),將會導(dǎo)致整數(shù)溢出.

例如:求滿足條件1+2+3+…+n≤32767的最大整數(shù)n,如下實(shí)例10:

main()

{int n=1,sum=0;

while(sum<=32767) {sum+=n; n++;}

printf(“n=%d\n”,n-1);}

乍看該程序時(shí)無錯誤,但事實(shí)上,上列程序中的while循環(huán)是一個(gè)無限循環(huán),原因在于int型數(shù)的表示范圍為-32768到+32767,當(dāng)累加和sum超過32767時(shí),便向高位進(jìn)位,而對int型數(shù)而言,最高位表示符號,故sum超過32767后便得到一個(gè)負(fù)數(shù),while條件當(dāng)然滿足,從而形成無限循環(huán)。解決此類問題是將數(shù)據(jù)容量升高,sum定義為long int型。

3.2求值順序

可能說起求值順序,許多人能聯(lián)想到運(yùn)算符的優(yōu)先級問題,但其實(shí)這不是一回事。運(yùn)算符優(yōu)先級是諸如:a+b*c等同于a+(b*c);而求值順序是諸如:if(n!=0&&x/n>y),此時(shí)即使n=0時(shí),也不會出現(xiàn)“0作為除數(shù)”的錯誤。原因就是因?yàn)楫?dāng)n=0時(shí),n!=0的表達(dá)式為0,不會再運(yùn)算到后面的表達(dá)式。

C語言中某些運(yùn)算符總是以一種已知的、規(guī)定的順序來對其操作數(shù)進(jìn)行求值,而另外一些則不是這樣的。再如:a

C語言中只有四個(gè)運(yùn)算符(&&、||、?: 、 ,)存在規(guī)定的求值順序。邏輯運(yùn)算符“&&”和“||”首先對左操作數(shù)求值,只在需要時(shí)才對右側(cè)操作數(shù)求值。運(yùn)算符“?:”是三元運(yùn)算符,在a?b:c中,首先對操作數(shù)a進(jìn)行判斷,再確定求b還是c。如:1>2?3:4,由于1>2結(jié)果為假,則最終表達(dá)式值為4。而逗號運(yùn)算符,首先對左側(cè)操作數(shù)求值,然后該值被“丟棄”,再對右側(cè)操作數(shù)求值。如:a=1,2,3;最終a的值為3。

4 總結(jié)

本文筆者通過多年的教學(xué)經(jīng)驗(yàn)總結(jié)出一些應(yīng)用性實(shí)例,針對初學(xué)者在學(xué)習(xí)C語言時(shí)易犯的錯誤,分類討論后給予錯誤分析,并提出相應(yīng)的解決方案。如想熟練掌握C語言,需要學(xué)生們不斷地總結(jié)分析,大量的上機(jī)實(shí)踐,這樣才能積累更多的程序設(shè)計(jì)經(jīng)驗(yàn)。

參考文獻(xiàn):

[1] 張悅. 一種基于程序結(jié)構(gòu)的程序主變元分析與確定方法研究[D].北京:北京化工大學(xué),2008.

[2] 常鑫.C語言程序設(shè)計(jì)的輸入輸出[J]. 內(nèi)蒙古科技與經(jīng)濟(jì),2012(1).

[3] 雷萌. C語言疑惑經(jīng)驗(yàn)談[J].軟件導(dǎo)刊,2011(3).

[4] 朱一峰.C語言常見錯誤分析及解決方法[J].遼寧師專學(xué)報(bào),2009,11(4).

[5] 張海燕.C語言學(xué)習(xí)中的難點(diǎn)淺析[J].科技資訊,2008(29).

猜你喜歡
常見錯誤初學(xué)者解決方法
初學(xué)者,趕緊看過來
童話世界(2020年26期)2020-10-27 02:23:28
淺談如何提高初學(xué)者的鋼琴演奏能力
北方音樂(2017年4期)2017-05-04 03:40:34
初學(xué)者如何臨寫《九成宮醴泉路》
丹青少年(2017年2期)2017-02-26 09:10:56
關(guān)于初中數(shù)學(xué)最簡二次根式的探究
考試周刊(2016年104期)2017-01-19 13:12:46
初中生解一元一次方程常見錯誤及成因分析
考試周刊(2016年93期)2016-12-12 10:13:14
小學(xué)數(shù)學(xué)教學(xué)中存在的問題及其解決方法
淺談我國現(xiàn)階段農(nóng)村經(jīng)濟(jì)管理
農(nóng)村移動網(wǎng)絡(luò)覆蓋探討
針對回轉(zhuǎn)式空氣預(yù)熱器漏風(fēng)問題解決方案的研究
俄語動詞體使用中常見錯誤分析
戲劇之家(2016年16期)2016-09-28 19:15:30
华安县| 竹北市| 海南省| 灯塔市| 宜黄县| 五莲县| 九江市| 梓潼县| 上饶市| 察隅县| 班戈县| 乾安县| 资源县| 庄河市| 金寨县| 崇义县| 齐齐哈尔市| 水富县| 周至县| 老河口市| 沾化县| 阜南县| 体育| 林芝县| 罗平县| 株洲县| 沁水县| 甘孜县| 横峰县| 满城县| 永丰县| 涞源县| 砀山县| 蒙自县| 富川| 武冈市| 泽普县| 皮山县| 财经| 吐鲁番市| 台北县|