【摘 要】C語言中運算符十分豐富,自加運算和自減運算是c語言的教學中的重點和難點,但我們只要在教學中抓住運算的基本定義,通過經典題型分析和適度深入解析,就不難達到熟練應用之目的。
【關鍵詞】運算的定義;經典題型;深度解析
C語言作為一種計算機程序設計語言,它既具有高級語言的特點,又具有匯編語言的特征,編程功能十分強大。C語言定義了豐富的運算,多達40余種,這給c語言的學習帶來了一定的困難。++運算(自加運算)和--運算(自減運算)正是這些運算中極具特點而又非常重要的兩種運算,在教學中,歷來是教學的難點,而關于這方面的系統的講解資料又很難找到,本人在c語言教學中,對++和--運算就教學中碰到的問題,做了一些探索性的研究,現歸納總結,以期與同行共勉。
一、運算的定義
1. ++(自加運算)的定義
++(自加運算)是單目運算,且只能以變量為運算對象,如i++,++a等(i,a為已定義變量),它等效于i=i+1(a=a+1),但是,自加運算又有自己的特點——與其它運算的相關性,雖然對變量i來講,i++與++i沒有什么區別,但當i++和++i還參與其它運算時,i++和++i對整個運算結果的影響是不同的,例如有如下程序段:
int i=1 ,s ;
s=(i++)+1;
printf(“i=%d;s=%d\n”,i,s);
其運行結果是:i=2;s=2
若將程序中s=(i++)+1;換為s=(++i)+1;其它不變,其運行結果就會變為:i=2;s=3 ,此處我們可以看到: i++與++i的不同,并不影響i本身的結果,但卻對s的值產生了不同的影響,這是因為系統在處理++i時先對i進行了加1運算,即:i=i+1,然后才參與其它運算,而在執行i++時,現將i的值參與其它運算,然后才給自己加1,所以得到的s的值是不同的,這正是++(自加運算)與眾不同的地方。
2. --(自減運算)的定義
與自加運算類似,--(自減運算)也是單目運算,且只能以變量為運算對象,若i為已定義變量,i的自減運算分為--i和i-- ,兩者對i自身的作用是一樣的,即i=i-1 ,但當它們還參與其它運算時,--i先執行自減1運算,然后以i的值參與其它運算,i--則先以i值參與其它運算,然后對i進行自減1運算。
二、經典題型
下列程序執行后輸出結果是什么?
main()
{int a=100;
printf(“a++=%d;”,a++); */①/*
printf(“++a=%d;”,++a); */②/*
printf(“a--=%d;”,a--); */③/*
}
當程序執行到①時,輸出表達式a++,由于自加符++后置,故先輸出a的值100,然后a自加1,即執行完①后輸出“a++=100”,a的值是101。
當程序執行到②時,輸出表達式++a,由于自加符++前置,故a先自加1變為102,然后輸出a的值102,即執行完②后輸出“++a=102”,a的值是102。
當程序執行到③時,輸出表達式a--,由于自加符--后置,故先輸出a的值102,然后a自減1,即執行完③后輸出“a--=102”,a的值是101。
綜上所述,程序輸出結果為:
a++=100;++a=102;a--=102
小結:該題目只要深刻領會++(--)運算在運算符前置和后置時,對其參與的其它運算(操作)的處理時機是不同的,前置時先進行自加1(自減1)運算,再進行其它運算(操作),后置時先參與其它運算(操作),再進行自加1(自減1)運算。
三、深度解析
1. 分析下列程序執行后的輸出結果
#include
main( ){
int i =1,j=2, p=0,q=0 ;
printf(“%d,%d,%d,%d”, p+i , j++ , q+j ,-- i ); */⑤/*
}
很多同學分析:在程序執行到⑤時 p+i輸出1(0+1=1) ;j++輸出2(j=2),j=2+1=3 ;q+j輸出3(0+3=3);--i輸出0(1-1=0) 。得到的結果是:1 ,2 ,3 ,0 。然而上機運行的結果卻是:0 ,2 ,2 ,0 ,這是為什么呢?原來,turboC在printf()函數中,處理表達式列表的順序是從右到左進行的,如果在表達式列表中不包含自加(自減)運算,從哪邊開始處理數據都不會影響運算結果,但是,如果表達式列表中包含了自加(自減)運算,這個“處理數據的順序”就會影響到數據的運算結果。正確的做法是先處理—i,輸出0(1-1=0);其次是q+j,輸出2(0+2=2);再次是j++,輸出2(j=2,執行j++后j=3);最后是p+i,輸出0(0+0=0),處理完畢后按原來順序輸出結果:0,2,2,0 。
結論:turboC在printf(“字符串”,表達式列表)函數中,處理表達式列表的順序是從右到左進行的,如果在表達式列表中包含自加(自減)運算,運算起來就要十分細心。
2.分析如下程序輸出結果:
#include
main( ){
int i=5,j=5,p,q;
p=(i--)+( ++ i)+(i++); */ ⑥/*
q=(++j)+( j++); */ ⑦/*
printf(“%d,%d,%d,%d”,p,q,i,j);
}
嚴格的講,程序中⑥、⑦中的表達式是不符合C語言語法規范的。盡管如此,但在實際當中,我們仍會經常碰到類似的題目,而且這些題目在機器上運行也會有特定的結果,因此在這里我仍然想探討一下其解法。
筆者經過反復推敲,找到了一種解決這類問題的辦法,并在實際應用中與機器執行的結果符合的很好。
我的思路是:將⑥或⑦中右側表達式的運算分為3類:前置(自加或自減)運算、后置(自加或自減)運算和加(減)法運算,首先要進行的是前置運算,其次執行加(減)法運算,最后執行后置運算。如(i--)+( ++ i)+(i++),其中中間的自加運算為前置運算,其前后的自減運算和自加運算都是后置運算,首先進行前置運算,即++i,執行后i=5+1=6;然后執行加法運算,即3個i相加;結果為6+6+6=18,最后執行后置運算,即i=6+1-1=6 。所以題目中p=18,i=6。同理(++j)+( j++)中++j為前置運算,j++為后置運算,先進行前置運算j=5+1=6;然后執行加法運算,即2個j相加6+6=12;最后進行后置運算j=6+1=7 。所以題目中q=12,j=7,程序最后運行結果為:18,12,6,7 。以上方法可擴展到任何含有自加(自減)運算的運算表達式中。
四、結論
當一個表達式中含有多個自加(自減)運算時,可將運算分為前置運算、后置運算和其它運算,按照先執行前置運算,然后執行其它運算,最后執行后置運算的法則,可得到正確的運算結果。
對C語言的教學而言,能讓學生理解到以上的深度,我認為教學的任務就完成了,至于更深層次的研究就是他們以后的事了,希望本文能給廣大C語言教學工作者帶來便利!
參考文獻:
[1] Dennis M. Ritchie等. The C programming Language [M].U.S:Prentice Hall,1988
[2]周查金等. C語言程序設計.北京:高等教育出版社,2000.5