摘要:本文介紹了C語言學(xué)習(xí)過程中所特有的一些知識(shí)難點(diǎn),主要有算術(shù)表達(dá)式、逗號(hào)表達(dá)式、復(fù)合語句、指針與一維數(shù)組。
關(guān)鍵詞:C語言;算術(shù)表達(dá)式;逗號(hào)表達(dá)式;復(fù)合語句;指針與一維數(shù)組
中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)12-2pppp-0c
Four Difficulties in Learning C Language
DING Lei,F(xiàn)ANG Fang
(Information Engineering University of PLA,Electronic Technology Institute Guangzhou Branch,Guangzhou 510510,China )
Abstract:The paper has introduced four difficulties in learning C language,briefly explained arithmetic expression,comma expression,complex sentence,pointer and one dimension array.
Key words:C language;arithmetic expression;comma expression;complex sentence;pointer;one dimension array
C語言是一種結(jié)構(gòu)化語言,適于按模塊化方式組織程序,層次十分清晰,易于調(diào)試和維護(hù)。C語言的表現(xiàn)能力和處理能力極強(qiáng),不僅具有豐富的運(yùn)算符和數(shù)據(jù)類型,便于實(shí)現(xiàn)各類復(fù)雜的數(shù)據(jù)結(jié)構(gòu),而且還可以直接訪問內(nèi)在的物理地址,進(jìn)行位(bit)一級(jí)的操作。由于C語言的功能強(qiáng)大、應(yīng)用廣泛,它成為了目前軟件開發(fā)的最常用的軟件之一,同時(shí)也是二級(jí)考試中很受歡迎的考試之一,能為今后參加三級(jí)、四級(jí)學(xué)習(xí)和考試打下良好的基礎(chǔ)。
下面我們重點(diǎn)來講一講C語言學(xué)習(xí)過程中所特有的一些知識(shí)難點(diǎn)。
算術(shù)表達(dá)式
C語言中的算術(shù)運(yùn)算有單目運(yùn)算和雙目運(yùn)算兩種。單目運(yùn)算指的是該運(yùn)算符只能連接一個(gè)運(yùn)算量,除了正負(fù)號(hào)外,主要有++(加1)和--(減1),它有前綴和后綴這分,主要區(qū)別在于前綴++n表示先令n=n+1,然后取n的值,后綴n++表示先取n的值,然后令n=n+1。雙目運(yùn)算是指該運(yùn)算符的左右兩側(cè)都必須有運(yùn)算量。常見的雙目運(yùn)算符有:+、-、*、/、%等等。諸如x+y、x/y、x*y等運(yùn)算均為雙目運(yùn)算。遇到雙目運(yùn)算時(shí),要特別注意數(shù)據(jù)的類型問題。具體要求有以下幾點(diǎn):
(1)雙目運(yùn)算的結(jié)果的類型必須與運(yùn)算量的類型一致;
(2)如果參與雙目運(yùn)算的兩個(gè)運(yùn)算量類型不一致,系統(tǒng)將自動(dòng)把其中的一個(gè)進(jìn)行類型轉(zhuǎn)換,使兩個(gè)運(yùn)算量的類型一致后再進(jìn)行運(yùn)算。自動(dòng)轉(zhuǎn)換的規(guī)則是:按“向高看齊”的原則進(jìn)行轉(zhuǎn)換。在幾個(gè)基本的數(shù)據(jù)類型中,由高到低的排列順序?yàn)椋篸ouble、int、char。
2000年春季考試中有一道選擇題:
下列程序的輸出結(jié)果是( )
解析:本題中,程序先執(zhí)行語句x=1.2,根據(jù)賦值運(yùn)算的類型轉(zhuǎn)換規(guī)則,這里要將double類型的常量1.2轉(zhuǎn)換為int類型,即取整為1,然后將1賦值給變量x。接下來執(zhí)行語句y= (x+3.8) /5.0;根據(jù)運(yùn)算符的優(yōu)先級(jí),先計(jì)算小括號(hào)內(nèi),再計(jì)算除法,最后執(zhí)行賦值運(yùn)算。小括號(hào)內(nèi)的運(yùn)算過程為:先將整型變量x的值1轉(zhuǎn)換為double型1.0,然后與3.8進(jìn)行加法運(yùn)算,得到中間結(jié)果4.8。接著進(jìn)行除法運(yùn)算4.8/5.0,其結(jié)果小于1.0,這里沒有必要計(jì)算出精確值,因?yàn)榻又M(jìn)行賦值運(yùn)算,賦值號(hào)左邊的變量y的類型為整型,于是對(duì)這個(gè)小于1.0的中間結(jié)果進(jìn)行取整,結(jié)果為0,于是變量y的值為0。因此該程序的輸出結(jié)果應(yīng)該是0,即正確答案為C。
逗號(hào)表達(dá)式
C語言中的逗號(hào)表達(dá)式的形式如下:
表達(dá)式1,表達(dá)式2,表達(dá)式3,……,表達(dá)式n
學(xué)習(xí)逗號(hào)表達(dá)式時(shí)一定要掌握它的要領(lǐng):1.逗號(hào)表達(dá)式的運(yùn)算過程為:從左往右逐個(gè)計(jì)算;2.逗號(hào)表達(dá)式是作為一個(gè)整體的,它的最終結(jié)果就是最后一個(gè)表達(dá)式(也即表達(dá)式n)的值;3.逗號(hào)運(yùn)算符的優(yōu)先級(jí)別是所有運(yùn)算符中最低的。只有這樣,才能真正掌握這種運(yùn)算,得出正確的解答。
2001年秋季考試中有一道選擇題(此題曾在1998年考試中出現(xiàn)過):
若已定義x和y為double類型,則表達(dá)式:x=1, y=x+3/2的值是:
A) 1 B) 2 C) 2.0 D) 2.5
解析:該表達(dá)式就是一個(gè)逗號(hào)表達(dá)式,所以要按照運(yùn)算順序先運(yùn)算x=1,所以變量x的值為1.0,然后運(yùn)算y=x+3/2,此表達(dá)式中需先計(jì)算兩個(gè)整數(shù)相除3/2,結(jié)果為整數(shù)1,然后再與x相加,結(jié)果為2.0。由于逗號(hào)表達(dá)式x=1, y=x+3/2的值就是其最后一個(gè)表達(dá)式即y=x+3/2的值,此值即為2.0,所以正確的答案應(yīng)該是C。
復(fù)合語句
復(fù)合語句就是用一對(duì)“||”把若干語句括起來構(gòu)成一個(gè)語句組,復(fù)合語句是C語言中最重要的一種語句,語句的形式如下:
{語句1;語句2;……;語句n;}
一個(gè)復(fù)合語句在語法上視為一條語句,在復(fù)合語句中,花括號(hào)內(nèi)的語句數(shù)量不限,可以有執(zhí)行語句,也可以有定義部分,定義部分應(yīng)該出現(xiàn)在可執(zhí)行語句的前面,復(fù)合語句可以嵌套使用,例如:{語句1{語句2;……;語句n;}}。
復(fù)合語句還可以嵌套C語言中任何結(jié)構(gòu)的控制語句,如if、switch、while、for等。使用好復(fù)合語句的關(guān)鍵是理解和掌握變量的作用域。
2002年春季考試中有一道填空題:
下面程序的輸出結(jié)果是______
解析:本題程序中函數(shù)main的首部定義了3個(gè)整型變量a、b、c,按它們的初值,可計(jì)算執(zhí)行復(fù)合語句之前c的值為-2,b的值為3。進(jìn)入復(fù)合語句后,變量b、c被重新定義,并賦以初值,用戶可計(jì)算出復(fù)合語句中a、b、c的值分別是2、5、1,第一個(gè)printf語句輸出“2,5,1,”(沒有引號(hào),下同),最后執(zhí)行復(fù)合語句中的最后一條語句,可以得到a的值為2。變量b、c在main首部及復(fù)合語句中均被說明,在復(fù)合語句中,說明b、c的作用域只限制在本復(fù)合語句中,所以執(zhí)行復(fù)合語句之后的printf語句中的b、c的輸出值與復(fù)合語句中b、c的值無關(guān),其值應(yīng)該取復(fù)合語句之前的兩個(gè)賦值語句的計(jì)算結(jié)果,即b值為3,c值為-2,也就是說,第二個(gè)printf語句的輸出結(jié)果為“2,3,-2”,所以正確答案為“2,5,1,2,3,-2”。
指針與一維數(shù)組
指針與一維數(shù)組是二級(jí)C語言的必考內(nèi)容,甚至有時(shí)一次考試中會(huì)出現(xiàn)2到3個(gè)相關(guān)的題目,因此,掌握這一類題型的解答技巧是十分重要的。一般情況下,題目總是先定義一個(gè)一維數(shù)組和一個(gè)指針變量,如” int a[]={1,2,3,4,5}*p”,然后將數(shù)組a的首地址賦值給指針變量p,使指針p指向數(shù)組a的首地址,即“p=a;”,這樣就完成了數(shù)組與指針之前指向關(guān)系的建立。這是該類題目在提出問題前必須做的一件事,也是考生解答此類問題需要了解的前提條件。注意:數(shù)組a的首地址有兩種表示方法,一是直接用數(shù)組名a表示,二是用數(shù)組的第一個(gè)元素a[0]的地址a[0]表示,這兩種表示法是完全等價(jià)的。因此,上述表達(dá)式“p=a”也可寫成“p=a[0]”。通過語句“p=a;”在數(shù)組與指針之間建立了指向關(guān)系之后,接下來必須弄明白以下兩組等價(jià)關(guān)系:
第一組等價(jià)關(guān)系:以下4種表示法是等價(jià)的,它們均表示下標(biāo)為i的數(shù)組元素a[i](本例中,i的取值范圍為0到4 ):
a[i], p[i], *(a+i), *(p+i)
第二組等價(jià)關(guān)系:以下4種表示法也是等價(jià)的,它們均表示下標(biāo)為i的數(shù)組元素a[i]的地址值:
a[i], p[i], a+i, p+i
數(shù)組名a和指針p在使用時(shí)是可以相互替代的,所以凡a的地方均可以p替代,反之亦然。這其中要注意以下事實(shí):a是一個(gè)常量,它的值是不可改變的,而p是一個(gè)變量,它的值是可以改變的,這是它們之前唯一的區(qū)別。
明白了以上等價(jià)關(guān)系之后,就可以解答大部分此類題目了。
2002年春季考試中有一道選擇題:
若有以下定義:
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
則值為3的表達(dá)式是()
A) p+=2,*(p++)B) p+=2,*++p
C) p+=3,*p++ D) p+=2,++*p
解析:該題考查的主要內(nèi)容就是指針與一維數(shù)組,當(dāng)然它還涉及到了指針的移動(dòng)以及運(yùn)算符++和*之間的優(yōu)先級(jí)問題。首先確定,值為3的數(shù)組元素是a[2],因此也可用p[2]、*(a+2)或*(p+2)表示,但題目的4個(gè)選擇答案中都沒有出現(xiàn),所以要再考慮其他途徑。注意到4個(gè)表達(dá)式均為逗號(hào)表達(dá)式,它們的值應(yīng)該分別等于各自最后一個(gè)表達(dá)式的值。再看表達(dá)式p+=2的作用,在進(jìn)行這一運(yùn)算之前,指針p指向數(shù)組元素a[0],表達(dá)式p+=2使指針p向后移動(dòng)了2個(gè)存儲(chǔ)單元,也即運(yùn)算后指針p指向了數(shù)組元素a[2],同樣,經(jīng)過p+=3的運(yùn)算后,指針p指向了數(shù)組元素a[3]?,F(xiàn)在看答案A,先經(jīng)p+=2運(yùn)算,使p指向a[2],然后通過指針運(yùn)算符*引用表達(dá)式p++所指向的元素,我們知道,表達(dá)式p++的值就是p的值,所以*(p++)的值就等于*p的值,即a[2]的值3,它正符合題目要求,因此,A是正確答案。B表達(dá)式的值應(yīng)該為4(先使p指向a[3],然后通過p取值),C表達(dá)式的值應(yīng)該為4(先使p指向a[3],然后通過p取值),D表達(dá)式的值也為4(先使p指向a[2],然后通過p取值,最后自增1)。
參考文獻(xiàn):
[1]譚浩強(qiáng).C語言程序設(shè)計(jì).北京:清華大學(xué)出版社,2000.
收稿日期:2008-01-30
作者簡介:丁蕾(1981-),女,湖北荊州人,助教,主要研究方向:計(jì)算機(jī)軟件,英語教學(xué);方芳 (1973-),女,湖北武漢人,講師,主要研究方向:計(jì)算機(jī)工程。
注:“本文中所涉及到的圖表、注解、公式等內(nèi)容請(qǐng)以PDF格式閱讀原文?!?/p>