【摘要】本文結(jié)合C語(yǔ)言的教學(xué)實(shí)踐,講解了C 語(yǔ)言基礎(chǔ)知識(shí)的幾個(gè)難點(diǎn),是教學(xué)過(guò)程中學(xué)生較難掌握和容易出錯(cuò)的重要知識(shí)點(diǎn)。希望可以對(duì)學(xué)習(xí)C語(yǔ)言的讀者提供參考,能更好地理解C程序設(shè)計(jì)的思想、編寫出優(yōu)秀的C程序。
【關(guān)鍵詞】C語(yǔ)言;整形數(shù)據(jù);溢出;運(yùn)算符;自增自減 switch;循環(huán)語(yǔ)句
C語(yǔ)言作為國(guó)際上最流行的、應(yīng)用最廣泛的編程語(yǔ)言之一,一方面它具有高級(jí)語(yǔ)言的優(yōu)點(diǎn),另一方面又有著低級(jí)語(yǔ)言的特性,既適合編寫操作系統(tǒng)、編譯器等系統(tǒng)軟件,同時(shí)也適用編寫各種應(yīng)用軟件。因此,C語(yǔ)言越來(lái)越多地成為高等院校計(jì)算機(jī)專業(yè)的學(xué)生學(xué)習(xí)程序設(shè)計(jì)的首選課程。《C語(yǔ)言程序設(shè)計(jì)》是計(jì)算機(jī)專業(yè)的一門重要的基礎(chǔ)課程,也是《C++程序設(shè)計(jì)》、《數(shù)據(jù)結(jié)構(gòu)》等專業(yè)課的前導(dǎo)課程。筆者結(jié)合自己的教學(xué)實(shí)踐,談?wù)凜語(yǔ)言基礎(chǔ)知識(shí)的幾個(gè)難點(diǎn)。
一、整型數(shù)據(jù)的范圍
不同類型的數(shù)據(jù)在內(nèi)存中占用的存儲(chǔ)單元長(zhǎng)度不同,以VC++6.0的編譯環(huán)境為例,基本整型(int)數(shù)據(jù)分配4個(gè)字節(jié),短整型(short "int)數(shù)據(jù)分配2個(gè)字節(jié)。我們以short int為例。1個(gè)字節(jié)為8個(gè)二進(jìn)制位,每個(gè)短整型數(shù)據(jù)分配2個(gè)字節(jié),即16位。對(duì)于有符號(hào)位的短整型(signed short int,默認(rèn)的),最左面一位作為符號(hào)位,0表示正,1表示負(fù)。即能存儲(chǔ)的最大數(shù)為0111111111111111,第一位是0,表示正數(shù),后邊15位都是1,轉(zhuǎn)換為十進(jìn)制為32767;最小數(shù)為1000000000000000,轉(zhuǎn)換為十進(jìn)制為-32768。超出此范圍,即為“溢出”。例如:
short int a,b,c,d; "a=32767;b=a+1; " c=-32768;d=b-1;
printf(\"b=%d\t\",b); " printf(\"d=%d\n\",d); 輸出結(jié)果為b=-32768 " d=32767
對(duì)于無(wú)符號(hào)的短整型(unsigned short int),最小為0000000000000000,最大為1111111111111111,范圍0~65535。例如:
unsigned short int e=65535,f; "f=e+1;
printf(\"f=%d\n\",f); " "輸出結(jié)果為f=0
二、運(yùn)算符
算術(shù)運(yùn)算符有+,-,*,/,%,++,--。其中,*號(hào)在表達(dá)式中不可以省略,如b2-4ac,寫成表達(dá)式為b*b-4*a*c。/和%要區(qū)分好,/為商,%為余。如a可以被b整除,表示為a%b==0。++,--的使用方法有兩種:一種i++,i--,先使用i原值,再使i的值加或減1;第二種++i,--i,先使i的值加或減1,再使用i的新值。例如:
int i=11; printf(\"%d\n\",i++ * 1/3); " 輸出結(jié)果為3。
int i=11; printf(\"%d\n\",++i * 1/3); " 輸出結(jié)果為4。
自加自減運(yùn)算符在后邊的學(xué)習(xí)中會(huì)經(jīng)常用到,要好好理解。
邏輯運(yùn)算符有amp;amp;,||,!。在邏輯表達(dá)式中,不是所有的邏輯運(yùn)算符都執(zhí)行,只在必須執(zhí)行下一個(gè)邏輯運(yùn)算符才能求出表達(dá)式的解的時(shí)候,才執(zhí)行該運(yùn)算符。a amp;amp; b只有a為真時(shí),才判斷b的值。換句話說(shuō),a如果為假,b就不執(zhí)行。同理,a || b,a如果為真,b就不用執(zhí)行。例如:
int m=1,n=1,a=1,b=1;
printf(“表達(dá)式=%d\t”,(m=agt;b)amp;amp;(n=agt;b)); "printf(\"m=%d,n=%d\n\",m,n);
輸出結(jié)果為 表達(dá)式=0 " m=0,n=1
常用的運(yùn)算符的優(yōu)先級(jí)別從高到低排序?yàn)椋?!,算術(shù)運(yùn)算符(++,--高于*,/,%高于+,-),關(guān)系運(yùn)算符(gt;,gt;=,lt;,lt;=高于==,!=),amp;amp;,||,賦值運(yùn)算符,逗號(hào)運(yùn)算符。
三、比較數(shù)的大小
例如:編寫程序,輸出三個(gè)整數(shù)的最大值。剛接觸C語(yǔ)言的學(xué)生,大部分學(xué)生上機(jī)實(shí)踐都可以完成這個(gè)程序,但是思路不太好。調(diào)整算法思路,便于以后程序的編寫。
main( )
{ int a,b,c,max; " "max=a;
if(bgt;max) max=b; " if(cgt;max) max=c; "printf(\"max=%d\n\",max);}
同理,編寫程序,輸出10個(gè)整數(shù)的最大值。
main( )
{ int a[10],max,i; " for(i=0;ilt;=9;i++) "scanf(\"%d\",amp;a[i]);
max=a[0]; "for(i=1;ilt;=9;i++) "if(a[i]gt;max) max=a[i];
printf(\"max=%d\",max); " }
四、switch語(yǔ)句
處理選擇結(jié)構(gòu)有if語(yǔ)句和switch語(yǔ)句。switch語(yǔ)句用于處理多分支選擇結(jié)構(gòu),在使用時(shí)有多個(gè)注意點(diǎn),這里強(qiáng)調(diào)兩點(diǎn)。
1.case后邊的常量,不能寫成表達(dá)式。
例如:編寫程序,評(píng)判學(xué)生成績(jī)score的等級(jí)grade,90~100為A,80~90為B,70~80為C,60~70為D,60以下為E。
switch((int)(score/10))
{case 10: case 9: grade='A';break;
case 8: grade='B';break;
case 7: grade='C';break;
case 6: grade='D';break;
case 5: case 4: case 3: case 2: case 1: case 0: grade='E';}
很多學(xué)生最初拿到這個(gè)題目,會(huì)在case后邊寫條件表達(dá)式,case gt;90等,是錯(cuò)誤的。應(yīng)該找規(guī)律,如何將某個(gè)范圍內(nèi)的數(shù)據(jù)劃定在一個(gè)等級(jí)上,如果score為float類型,int(score/10)就是等級(jí)劃分的標(biāo)準(zhǔn)。
2.case標(biāo)號(hào)只起到標(biāo)記的作用,所以在各個(gè)case子句后邊要加break語(yǔ)句,使流程跳出當(dāng)前switch結(jié)構(gòu)。在switch嵌套結(jié)構(gòu)中,break只能跳出本層的switch結(jié)構(gòu)。例如:
main( )
{ int x=1,y=0,a=0,b=0;
switch(x) { "case 1:switch(y) { case 0:a++;
case 1:b++;break; " }
case 2:a++;b++;break; " } printf(\"a=%d,b=%d\n\",a,b); "} " "輸出結(jié)果為a=2,b=2。
switch(y)中的break不能退出switch(x),所以還要執(zhí)行case 2;如果想讓程序不執(zhí)行case 2,要在switch(y) { case 0:a++; " case 1:b++;break; "}語(yǔ)句后邊加break;。
五、循環(huán)語(yǔ)句
循環(huán)語(yǔ)句有while,do-while,for語(yǔ)句。掌握每種循環(huán)語(yǔ)句的結(jié)構(gòu)和執(zhí)行過(guò)程,清楚三種循環(huán)語(yǔ)句的適用情況,分析問(wèn)題,設(shè)計(jì)算法,上機(jī)實(shí)踐操作,熟練掌握,為以后程序設(shè)計(jì)奠定基礎(chǔ)。
參考文獻(xiàn)
[1]譚浩強(qiáng).C程序設(shè)計(jì)[M].清華大學(xué)出版社,2010.
[2]趙睿.C語(yǔ)言案例教程[M].機(jī)械工業(yè)出版社,2007.
[3]邱建華.C語(yǔ)言程序設(shè)計(jì)教程[M].東軟電子出版社,2009.