• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

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

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

      霍卓群

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

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

      中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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ù)不多的國(guó)內(nèi)外能同步的程序設(shè)計(jì)語言之一,可見,它在高校理工類專業(yè)基礎(chǔ)課程中的重要地位。對(duì)于剛進(jìn)入大學(xué)生活的學(xué)生們,開始學(xué)習(xí)C語言課程,會(huì)感覺C語言的知識(shí)點(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é)者能夠通過具體示例,吸取他人所犯錯(cuò)誤的經(jīng)驗(yàn)教訓(xùn)。

      1 詞法“陷阱”

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

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

      1.1 “=”不同于“==”

      在C語言中,符號(hào)“=”為賦值運(yùn)算符,符號(hào)“==”為比較運(yùn)算符。一般的,賦值運(yùn)算相對(duì)于比較運(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í)會(huì)發(fā)現(xiàn)即使輸入a,b的值不相同,輸出結(jié)果仍然是“a,b相等”。此問題的原因就在于if中的條件誤將賦值運(yùn)算符“==”寫成了比較運(yùn)算符“=”。

      1.2 “x

      在c語言中關(guān)系運(yùn)算符號(hào)與數(shù)學(xué)中接觸到的比較符號(hào),從使用方式和能夠都很相似,所以誤將兩者完全等價(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é)果。此問題在于對(duì)“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é)果為“假”,也就不會(huì)出現(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)義字符都作為有效字符;而對(duì)于數(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("請(qǐng)輸入性別(f/m)\n");

      scanf("%c",&gender);

      printf("請(qǐng)輸入婚姻狀況(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ī)避編譯器誤將回車鍵作為字符存儲(chǔ)至字符變量ms中,可以使用scanf("\n%c",&ms);

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

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

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

      1.4 字符與字符串

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

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

      main()

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

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

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

      2 語法“陷阱”

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

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

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

      main()

      { int x=2;

      if(x>2)

      printf("x>2");}

      程序運(yùn)行結(jié)果沒有輸出。但如果if(x>2)條件后面加上分號(hào),則輸出“x>2”。同樣的道理,如下,正常輸出結(jié)果為“543”;而如果while子句后加上分號(hào),此程序變成了“死循環(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è)之后,會(huì)自然而然地順序執(zhí)行下去,直到最后一個(gè)case語句。

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

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

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

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

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

      if(x>=0)

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

      else y=-5;

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

      3 語義“陷阱”

      3.1整數(shù)溢出

      C語言提供的數(shù)據(jù)類型有許多,其中整型數(shù)據(jù)提供了三種不同長(zhǎng)度的類別:short int、int和long int。不管是哪種數(shù)據(jù)類型都有一個(gè)固定的長(zhǎng)度,它能存儲(chǔ)的最大值是一個(gè)固定的整數(shù),當(dāng)嘗試去存儲(chǔ)一個(gè)大于這個(gè)固定最大值時(shí),將會(huì)導(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í)無錯(cuò)誤,但事實(shí)上,上列程序中的while循環(huán)是一個(gè)無限循環(huán),原因在于int型數(shù)的表示范圍為-32768到+32767,當(dāng)累加和sum超過32767時(shí),便向高位進(jìn)位,而對(duì)int型數(shù)而言,最高位表示符號(hào),故sum超過32767后便得到一個(gè)負(fù)數(shù),while條件當(dāng)然滿足,從而形成無限循環(huán)。解決此類問題是將數(shù)據(jù)容量升高,sum定義為long int型。

      3.2求值順序

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

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

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

      4 總結(jié)

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

      參考文獻(xiàn):

      [1] 張悅. 一種基于程序結(jié)構(gòu)的程序主變?cè)治雠c確定方法研究[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語言常見錯(cuò)誤分析及解決方法[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)勢(shì)是因?yàn)楫?dāng)程序員有意的略去一個(gè)break語句,則可以實(shí)現(xiàn)多個(gè)分支共同作用處理,重要的是看程序員如何應(yīng)用。

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

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

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

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

      if(x>=0)

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

      else y=-5;

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

      3 語義“陷阱”

      3.1整數(shù)溢出

      C語言提供的數(shù)據(jù)類型有許多,其中整型數(shù)據(jù)提供了三種不同長(zhǎng)度的類別:short int、int和long int。不管是哪種數(shù)據(jù)類型都有一個(gè)固定的長(zhǎng)度,它能存儲(chǔ)的最大值是一個(gè)固定的整數(shù),當(dāng)嘗試去存儲(chǔ)一個(gè)大于這個(gè)固定最大值時(shí),將會(huì)導(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í)無錯(cuò)誤,但事實(shí)上,上列程序中的while循環(huán)是一個(gè)無限循環(huán),原因在于int型數(shù)的表示范圍為-32768到+32767,當(dāng)累加和sum超過32767時(shí),便向高位進(jìn)位,而對(duì)int型數(shù)而言,最高位表示符號(hào),故sum超過32767后便得到一個(gè)負(fù)數(shù),while條件當(dāng)然滿足,從而形成無限循環(huán)。解決此類問題是將數(shù)據(jù)容量升高,sum定義為long int型。

      3.2求值順序

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

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

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

      4 總結(jié)

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

      參考文獻(xiàn):

      [1] 張悅. 一種基于程序結(jié)構(gòu)的程序主變?cè)治雠c確定方法研究[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語言常見錯(cuò)誤分析及解決方法[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)勢(shì)是因?yàn)楫?dāng)程序員有意的略去一個(gè)break語句,則可以實(shí)現(xiàn)多個(gè)分支共同作用處理,重要的是看程序員如何應(yīng)用。

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

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

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

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

      if(x>=0)

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

      else y=-5;

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

      3 語義“陷阱”

      3.1整數(shù)溢出

      C語言提供的數(shù)據(jù)類型有許多,其中整型數(shù)據(jù)提供了三種不同長(zhǎng)度的類別:short int、int和long int。不管是哪種數(shù)據(jù)類型都有一個(gè)固定的長(zhǎng)度,它能存儲(chǔ)的最大值是一個(gè)固定的整數(shù),當(dāng)嘗試去存儲(chǔ)一個(gè)大于這個(gè)固定最大值時(shí),將會(huì)導(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í)無錯(cuò)誤,但事實(shí)上,上列程序中的while循環(huán)是一個(gè)無限循環(huán),原因在于int型數(shù)的表示范圍為-32768到+32767,當(dāng)累加和sum超過32767時(shí),便向高位進(jìn)位,而對(duì)int型數(shù)而言,最高位表示符號(hào),故sum超過32767后便得到一個(gè)負(fù)數(shù),while條件當(dāng)然滿足,從而形成無限循環(huán)。解決此類問題是將數(shù)據(jù)容量升高,sum定義為long int型。

      3.2求值順序

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

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

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

      4 總結(jié)

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

      參考文獻(xiàn):

      [1] 張悅. 一種基于程序結(jié)構(gòu)的程序主變?cè)治雠c確定方法研究[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語言常見錯(cuò)誤分析及解決方法[J].遼寧師專學(xué)報(bào),2009,11(4).

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

      猜你喜歡
      常見錯(cuò)誤初學(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é)最簡(jiǎn)二次根式的探究
      考試周刊(2016年104期)2017-01-19 13:12:46
      初中生解一元一次方程常見錯(cuò)誤及成因分析
      考試周刊(2016年93期)2016-12-12 10:13:14
      小學(xué)數(shù)學(xué)教學(xué)中存在的問題及其解決方法
      淺談我國(guó)現(xiàn)階段農(nóng)村經(jīng)濟(jì)管理
      農(nóng)村移動(dòng)網(wǎng)絡(luò)覆蓋探討
      針對(duì)回轉(zhuǎn)式空氣預(yù)熱器漏風(fēng)問題解決方案的研究
      俄語動(dòng)詞體使用中常見錯(cuò)誤分析
      戲劇之家(2016年16期)2016-09-28 19:15:30
      沽源县| 东宁县| 汤阴县| 三台县| 岚皋县| 元阳县| 崇礼县| 财经| 横峰县| 双柏县| 酒泉市| 新竹县| 于田县| 团风县| 恩平市| 西安市| 南宫市| 花莲县| 福海县| 临沧市| 深圳市| 石棉县| 辉县市| 绥德县| 长海县| 诸城市| 苏尼特右旗| 湘潭县| 西安市| 汉阴县| 长阳| 绩溪县| 若尔盖县| 固原市| 灌阳县| 三都| 崇礼县| 阜康市| 临安市| 易门县| 堆龙德庆县|