版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C語中的自增自減推薦精選摘要運(yùn)算符多、操作靈活是C語言的一大特色。在諸多運(yùn)算符中,最難理解、最容易出錯的便是自增、自減運(yùn)算符。本文就這兩個運(yùn)算符使用中應(yīng)注意的問題進(jìn)行了分析介紹。關(guān)鍵詞C語言自增運(yùn)算符自減運(yùn)算符Points for Attention of Using Auto-increasing and Auto-decreasing Operators in Language CWang HongAbstract:Many operators and convenient operation characterize language C. Among those operators,
2、the most difficult to understand and the easiest to mistake are auto-increasing and auto-decreasing operators. This paper analyses the notices in using these two operators.Key words:Language Cauto-increasing operatorsauto-decreasing operators在程序設(shè)計中,經(jīng)常遇到“i=i+1”和“i=i-1”這兩種極為常用的操作。變量i被稱為“計數(shù)器”,用來記錄完成某一操
3、作的次數(shù)。C語言為這種計數(shù)器操作提供了兩個更為簡潔的運(yùn)算符,即+和-,分別叫做自增運(yùn)算符和自減運(yùn)算符。它們是從右向左結(jié)合的一元算術(shù)運(yùn)算符,優(yōu)先級為2。學(xué)習(xí)和應(yīng)用這兩個運(yùn)算符時應(yīng)注意以下幾點(diǎn):1注意表達(dá)式的值和變量值的區(qū)別以自增運(yùn)算符為例,當(dāng)自增運(yùn)算符+作用于一個變量時,例如:當(dāng)i=3時+i這個算術(shù)表達(dá)式的值為4,同時變量i的值也由原來的3改變?yōu)?。一般情況下,計算表達(dá)式后不改變變量本身的值,而+運(yùn)算符和-運(yùn)算符組成的表達(dá)式計算后,則改變變量的值,這稱為運(yùn)算符的副作用。這類運(yùn)算符在計算表達(dá)式時,一定要注意區(qū)分表達(dá)式的值和變量的值。2注意前綴運(yùn)算和后綴運(yùn)算的區(qū)別仍以自增運(yùn)算符為例,該運(yùn)算符可作用在
4、變量之前,例如前面所講的+i,稱為前綴運(yùn)算;也可作用在變量之后,例如i+,稱為后綴運(yùn)算。在這兩種運(yùn)算中,表達(dá)式的值不同:前綴運(yùn)算后,表達(dá)式的值為原變量值加1;后綴運(yùn)算后,表達(dá)式的值仍為原變量值;而變量值不論前綴運(yùn)算還是后綴運(yùn)算都加1。自減運(yùn)算符與自增運(yùn)算符類似,只要將加1改為減1即可。即前綴運(yùn)算是“先變后用”,而后綴運(yùn)算是“先用后變”。3注意運(yùn)算符的運(yùn)算對象自增、自減運(yùn)算符只能作用于變量,而不能作用于常量或表達(dá)式。因?yàn)樽栽?、自減運(yùn)算符具有對運(yùn)算量重新賦值的功能,而常量、表達(dá)式無存儲單元可言,當(dāng)然不能做自增、自減運(yùn)算。只要是標(biāo)準(zhǔn)類型的變量,不管是整型、實(shí)型,還是字符型、枚舉型都可以作為這兩個運(yùn)算
5、符的運(yùn)算對象。如以下四個表達(dá)式都是合法的:i+j+、+i+(+j)、+a+b+、+array-j;而+6、(i+j)+、A+、+i+j、(&p)+這五個表達(dá)式卻是不合法的。為什么i+j+合法,而+i+j卻不合法?C的編譯器對程序編譯時,從左到右盡可能多地將字符組合成一個運(yùn)算符或標(biāo)識符,因此i+j+等效于(i+)+(j+),兩個“+”作用的對象都是變量,這是合法的;而+i+j等效于+(i+)+j,第1個“+”作用的對象是表達(dá)式“i+”,這是不允許的。4注意運(yùn)算符的結(jié)合方向表達(dá)式k=-i+等效于k=(-i)+還是k=-(i+)?因?yàn)樨?fù)號運(yùn)算符和自增運(yùn)算符優(yōu)先級相同,哪一個正確就得看結(jié)合方向
6、。自增、自減運(yùn)算符及負(fù)號運(yùn)算符的結(jié)合方向是從右向左。因此,上式等效于k=-(i+);若i=5,則表達(dá)式k=-i+運(yùn)算之后k的值為-5,i的值為6。此賦值表達(dá)式的值即為所賦的值-5。不要因?yàn)閗=-i+等效于k=-(i+)就先做“+”運(yùn)算!這里采用的是“先用后變”,即先拿出i的值做負(fù)號“-”運(yùn)算,把這個值賦給變量k之后變量i才自增。5注意運(yùn)算符的副作用C語言允許在一個表達(dá)式中使用一個以上的賦值類運(yùn)算,包括賦值運(yùn)算符、自增運(yùn)算符、自減運(yùn)算符等。這種靈活性使程序簡潔,但同時也會引起副作用。這種副作用主要表現(xiàn)在:使程序費(fèi)解,并易于發(fā)生誤解或錯誤。例如,當(dāng)i=3時,表達(dá)式(i+)+(i+)+(i+)的值為
7、多少,各種教材說法不統(tǒng)一:有的認(rèn)為是9(3+3+3,如譚浩強(qiáng)的C程序設(shè)計,清華大學(xué)出版社,1991);也有的認(rèn)為是12(3+4+5,如王森的C語言程序設(shè)計,電子工業(yè)出版社,1995)。到底哪一個說法正確呢?不妨看看下面這個程序的運(yùn)行情況:main( )int i,j;i=3; j=(i+)+(i+)+(i+); printf(“nj=%d,”j);i=3; printf(“j=%d”,(i+)+(i+)+(i+);在TC3.0上運(yùn)行,其結(jié)果則是:j=9,j=12,究其原因,“先用后變,先變后用“中的“先”和“后”是一個模糊的概念,很難給出順序或時間上的準(zhǔn)確定論?!跋取钡绞裁磿r候,“后”到什么程
8、度?沒有此方面的詳細(xì)資料可供查詢。為此,筆者用各種表達(dá)式上機(jī)測試,結(jié)果發(fā)現(xiàn)當(dāng)表達(dá)式的值作為printf函數(shù)的直接輸出對象時,“先變后用”和“先用后變”中的“后”就是指+i和i+這一小項運(yùn)算完之后,如上面程序中最后一個語句中的輸出對象:第一個(i+)取出i的值3以后i立即變?yōu)?,第二個(i+)取出i的值4以后i立即變?yōu)?,第三個(i+)取出i的值5以后i立即變?yōu)?,這樣輸出的結(jié)果便是3+4+5這個表達(dá)式的值,即12。而在其它一些表達(dá)式或語句中,“變”或“用”的時機(jī)卻很難掌握。下列各式中變量j的值都是在i=3,k=1的前提下求出的:后綴運(yùn)算:(1)j=(5,6,(i+)+(i+)+(i+): j=
9、9(3+3+3)(2)j=(k+,6,(i+)+(i+)+(i+): j=9(3+3+3)(3)j=1?(i+)+(i+)+(i+): 0: j=9(3+3+3)(4)j=i?(i+)+(i+)+(i+): 0: j=12(3+4+5)(5)j=k+?(i+)+(i+)+(i+): 0: j=12(3+4+5)前綴運(yùn)算:(6)j=(5,i,(+i)+(+i)+(+i): j=18(6+6+6)(7)j=(5,k+,(+i)+(+i)+(+i): j=15(4+5+6)(8)j=1?(+i)+(+i)+(+i): 0: j=18(6+6+6)(9)j=1?(k+,(+i)+(+i)+i): 0:
10、 j=15(4+5+6)(10)j=k+?(+i)+(+i)+(+i): 0: j=15(4+5+6)其中(3)和(4)、(6)和(7)、(8)和(10)等這幾對類型相同的表達(dá)式卻得到完全不同的運(yùn)算結(jié)果,令人費(fèi)解!由此可見,在一般表達(dá)式中,就i+來說,“先用后變”中何時“變”很難說得清楚;對+i來說,“先變后用”中何時“用”也不易道白(自減運(yùn)算符與此類似)。因此,讀者在使用這類運(yùn)算符時一定要特別注意。克服這類副作用的方法是,盡量把程序?qū)懙靡锥恍磳①M(fèi)解處分解成若干個語句。如:k=i+j:可寫成k=i+j:i+:而類似(i+)+(i+)+(i+)這類連續(xù)自增、自減的運(yùn)算最好不要使用,以避免疑
11、團(tuán)的出現(xiàn),同時也可減少程序出錯的可性能。在程序設(shè)計中,效率和易讀性是一對主要矛盾。為了提高程序的效率,需要用技巧把程序?qū)懙帽M可能簡潔一些,但這樣有可能降低程序的可讀性和可理解性。可讀性差的程序容易隱藏錯誤且難于糾正,不易維護(hù),降低了程序的可靠性。鑒于“軟件危機(jī)”的教訓(xùn),人們在程序設(shè)計時遵守的基本規(guī)范是:可靠性第一,效率第二。為了保證可靠性,程序必須清晰易讀,而表達(dá)式的清晰易讀是十分重要的方面。因此,在C程序設(shè)計中,要慎重使用自增、自減運(yùn)算符,特別是在一個表達(dá)式中不要多處出現(xiàn)變量的自增、自減等運(yùn)算。安裝教科書上說明:“函數(shù)參數(shù)的求值順序是自右向左”更是大錯特錯。樓主,C語言跟大多數(shù)語言一樣,沒有
12、規(guī)定表達(dá)式的求值順序,除了以下幾個順序點(diǎn):;(分號,標(biāo)志一條語句結(jié)束),(逗號操作符,函數(shù)參數(shù)列表里面的逗號只起分隔作用,不是逗號操作符)&&和|(邏輯與,邏輯或)? : (條件運(yùn)算符)()(if,while,for, do.while,以及函數(shù)調(diào)用)這些統(tǒng)稱為順序點(diǎn),它們的求值順序有規(guī)定。我這里只給你說明逗號操作符,其他的不一一作介紹(不然能寫一大篇呢),你自己參考相關(guān)資料。逗號表達(dá)式最簡單的情形如下:exp1, exp2;C語言保證exp1在exp2之前求值,并且exp1求值的副作用保證在逗號之前生成。所以象下面這個逗號表達(dá)式:int i = 1;i+, (i = 2);最
13、后的值就是1,因?yàn)槎禾柋磉_(dá)式的前半部分i+的副作用(i自增1)在逗號之前已經(jīng)生成,所以當(dāng)執(zhí)行到(i = 2)的時候,i的值已經(jīng)是2了,所以i = 2成立,(i = 2)的值便作為整個逗號表達(dá)式的值。但是,對函數(shù)原型,函數(shù)定義,函數(shù)調(diào)用,C語言里面明確說明,參數(shù)列表里面的逗號不是逗號操作符,只起到分隔作用,所以這里的逗號不再是一個順序點(diǎn),那它前后的表達(dá)式的求值順序就是任意的,并且所有帶副作用的表達(dá)式的副作用都要等到下一個順序點(diǎn)之后才是確定的,也就是說你只有等到下一個順序點(diǎn)之后,你才能準(zhǔn)確得依賴這些表達(dá)式產(chǎn)生的副作用。所以,像這樣的函數(shù)調(diào)用foo(i+, +i);是得不到準(zhǔn)確的結(jié)果的。因?yàn)檫@里逗號
14、不是逗號操作符,所以就算編譯器選擇的是從左到右的求值順序,由于C語言不再保證i+的副作用在逗號之前生成,算到+i的時候,都不確定i到底有沒有自增1,不確定性就在這里產(chǎn)生了。再者,如果編譯器選擇的是從右到左求值,同樣產(chǎn)生不確定性,這樣一來,傳進(jìn)函數(shù)foo的兩個參數(shù)的值就可能不同,那么最后的結(jié)果當(dāng)然也就不同了。你這里一樣,printf是一個函數(shù),printf("%d,%d,%dn",+i,-i,-i+); 是函數(shù)調(diào)用,括號內(nèi)的所有逗號都不是逗號操作符,而只起到分隔參數(shù)的作用。所以+i,-i,-i+這三個表達(dá)式的求值順序是任意的,編譯器想怎么算就怎么算,不同的編譯器的“想法”可能
15、相同可能不同,結(jié)果就可能一樣可能不一樣。這才是樓上的各位得到不同結(jié)果的真正原因!推薦精選樓主要好好參考順序點(diǎn)的定義和作用,并且牢記下面這條規(guī)則:C語言里面明確指出:在兩個順序點(diǎn)之間兩次改變同一個變量的任何嘗試得到的結(jié)果都是不確定的!你這里int i=10; printf("%d,%d,%dn",+i,-i,-i+); 的兩個順序點(diǎn)分別是int i=10;的分號,和包圍printf的參數(shù)的括號,C語言只保證位于兩個順序點(diǎn)之間的表達(dá)式求值產(chǎn)生副作用在第二個順序點(diǎn)之前生成,但不保證兩個順序點(diǎn)之間所有表達(dá)式的求值順序。你這里+i,-i,-i+三個表達(dá)式企圖在兩個順序點(diǎn)前一個分號和(
16、)之間三次改變同一個變量i的值,所以結(jié)果注定是不確定的。至于為什么C語言要規(guī)定相鄰順序點(diǎn)之間的表達(dá)式以任意順序求值,是為了給編譯器更多的自由空間,讓底層運(yùn)算操作能由編譯器調(diào)度安排從而使運(yùn)算更有效地執(zhí)行。 1自加運(yùn)算符(+)使用自加運(yùn)算符時應(yīng)注意以下5個事項: 自加運(yùn)算符“+”的運(yùn)算結(jié)果是使運(yùn)算對象增1。例如,i+相當(dāng)于i=i+1。 運(yùn)算符“+”是單目運(yùn)算符,運(yùn)算對象可以是整型變量也可以是實(shí)整型變量,不能是常量或表達(dá)式。所以像+3、(i+j)+是不合法的。 用自加運(yùn)算符構(gòu)成表達(dá)式時,既可以是前綴形式,也可以是后綴形式。這兩種形式對于變量來說,其結(jié)果都是加1,但對表達(dá)式來說其值是不同的。 運(yùn)算符“
17、+”的結(jié)合方向是“自右向左”。 不要在一個表達(dá)式中對同一個變量進(jìn)行多次諸如i+或+i等運(yùn)算。2自減運(yùn)算符(-)推薦精選使用自減運(yùn)算符時應(yīng)注意以下5個事項: 自減運(yùn)算符“-”的運(yùn)算結(jié)果是使運(yùn)算對象減1。例如,i-相當(dāng)于i=i-1。 運(yùn)算符“-”是單目運(yùn)算符,運(yùn)算對象可以是整型變量也可以是實(shí)整型變量,不能是常量或表達(dá)式。 用自減運(yùn)算符構(gòu)成表達(dá)式時,既可以是前綴形式,也可以是后綴形式。這兩種形式對于變量來說,其結(jié)果都是減1,但對表達(dá)式來說其值是不同的。 運(yùn)算符“-”的結(jié)合方向是“自右向左”。 不要在一個表達(dá)式中對同一個變量進(jìn)行多次諸如i-或-i等運(yùn)算。對于代碼 int i =
18、3; i = i+; 不同編譯器給出不同的結(jié)果, 有的為 3, 有的為 4, 哪個是正確的?y:CtvA2FDe 沒有正確答案;這個表達(dá)式無定義。參見問題3.1,3.7和 11.32。 同時注意, i+ 和 +i 都不同于 i+1。如果你要使 i 自增 1, 使用 i=i+1, i+=1, i+ 或 +i, 而不是任何組合, 參見問題3.10。b*X s2mQ0N_12.35有人說 i = i+ 的行為是未定義的, 但是我剛在一個兼容 ANSI 的編譯器上測試, 得到了我希望的結(jié)果。_'J V
19、; 面對未定義行為的時候, 包括范圍內(nèi)的實(shí)現(xiàn)定義行為和未確定行為, 編譯器可以做任何實(shí)現(xiàn), 其中也包括你所有期望的結(jié)果。但是依靠這個實(shí)現(xiàn)卻不明智。參加問題7.4,11.31,11.32和11.34。'aH S5O4.2使用我的編譯器,下面的代碼 int i=7; printf("%dn", i+ * i+); 返回 49?不管按什么順序計算, 難道不該打印出56嗎?$!t |_*m 盡管后綴自加和后綴自減操作符 + 和-在輸出其舊值之后才會執(zhí)行運(yùn)算, 但這里的之后"常常被誤解。沒有任何保證確保自增或自減會在輸
20、出變量原值之后和對表達(dá)式的其它部分進(jìn)行計算之前立即進(jìn)行。也不能保證變量的更新會在表達(dá)式 完成" (按照 ANSI C 的術(shù)語, 在下一個 序列點(diǎn)" 之前, 參見問題推薦精選3.7) 之前的某個時刻進(jìn)行。本例中, 編譯器選擇使用變量的舊值相乘以后再對二者進(jìn)行自增運(yùn)算。BSD愛好者樂園 c5Du8(w2?a 包含多個不確定的副作用的代碼的行為總是被認(rèn)為未定義。(簡單而言, 多個不確定副作用" 是指在同一個表達(dá)式中使用導(dǎo)致同一對象修改兩次或修改以后又被引用的自增, 自減和賦值操作符的任何組合。這是一個粗略的定義; 嚴(yán)格的定義參見問題3.7, 未
21、定義" 的含義參見問題11.32。) 甚至都不要試圖探究這些東西在你的編譯器中是如何實(shí)現(xiàn)的 (這與許多 C 教科書上的弱智練習(xí)正好相反); 正如 K&R 明智地指出, 如果你不知道它們在不同的機(jī)器上如何實(shí)現(xiàn), 這樣的無知可能恰恰會有助于保護(hù)你。 以(i為例作為自增自減的變量)一、 在C語言中,是以整條語句為基礎(chǔ)的。1、先計算完所有的(+i)和(-i),得出這個時候的i值。2、再根據(jù)現(xiàn)在的i值計算整條語句的值。3、最后再根據(jù)(i+)和(i-)計算出i的值。例(1):int i=5,k;k=(+i)*(-i)*(-i);printf(&q
22、uot;k=%d i=%d",k,i);以上程序的輸出結(jié)果為:k=64 i=4。先計算(+i)、(-i)、(-i)的值,得出i=4,在算k=i*i*i,得出k=64。例(2):int i=3,k;k=(+i)*(i-)*(-i);printf("k=%d i=%d ",k,i);以上程序的輸出結(jié)果為:k=27 i=2 。先計算(+i)、(-i)的值,得出i=3,在算k=i*i*i,得出k=27。最后算(i-)推薦精選C程序中自增(自減)運(yùn)算的研究與分析李茂秋1 助理研究員,泰山學(xué)院計算機(jī)科學(xué)系
23、(271021), 推薦精選摘 要:自增(自減)運(yùn)算是C語言教學(xué)中的難點(diǎn)和重點(diǎn),大多C語言教材回避了這個繁瑣的問題,給C語言的學(xué)習(xí)增加了難度,本文作者在引用大量例程和上機(jī)實(shí)驗(yàn)的基礎(chǔ)上,詳細(xì)分析和討論了C語言自增(自減)運(yùn)算符的運(yùn)算規(guī)則,提出了自己的見解,對C語言學(xué)習(xí)者具有一定的啟發(fā)和借鑒作用。關(guān)鍵詞: C語言 自增運(yùn)算(符) 自減運(yùn)算(符) 自增(自減)因式 引 言 C語言具有豐富的運(yùn)算符,用以實(shí)現(xiàn)豐富的運(yùn)算功能,同時,其豐富的運(yùn)算符又具有繁雜的運(yùn)算規(guī)則,比如:優(yōu)先級、結(jié)合方向等。正確的理解和使用這些運(yùn)算符,能給程序設(shè)計帶來效率高、代碼簡單等好處,自增(自減)運(yùn)算符是C語
24、言中語法繁雜、運(yùn)用靈活的一個運(yùn)算符,在C語言的學(xué)習(xí)中,一直是一個難點(diǎn)和重點(diǎn),在歷年的等級考試中,占有較大的比重,但在各種C語言教材中,很少對此進(jìn)行詳細(xì)細(xì)致的介紹。此外,在實(shí)際編程實(shí)踐中,a+盡管和a=a+1都具有對a賦值的作用,但a+具有一個顯著的優(yōu)點(diǎn)就是,它比a=a+1要快,占用的RAM更少,原因是它們的指令執(zhí)行周期不同,產(chǎn)生的目標(biāo)代碼(機(jī)器碼)不同。因此,對+運(yùn)算符的詳細(xì)介紹十分必要,筆者結(jié)合多年的C語言教學(xué)和開發(fā)實(shí)踐,引用例程,擬對此進(jìn)行分析、討論與總結(jié)。一、 自增(自減)運(yùn)算符的基本理論在自反賦值運(yùn)算符中,有兩種特
25、殊的情況,也是兩種極為常用的操作,即k=k+1寫作k+=1,k=k-1寫作k-=1。這兩種運(yùn)算符對k所進(jìn)行的操作是增1(或減1)的操作,通常,我們把k當(dāng)作計數(shù)器,這兩個運(yùn)算符通常用來對計數(shù)器進(jìn)行控制,用來記錄完成某項任務(wù)的次數(shù),C語言為這兩種操作提供了更為簡潔的運(yùn)算符:k+或+k (k-或-k);+k/-k稱為前綴形式;k+/k-稱為后綴形式。無論前綴還是后綴的形式,都是使運(yùn)算對象自身增1(減1)。因此,稱+(-)自增(自減)運(yùn)算符。自增(自減)運(yùn)算符的優(yōu)先級是14,級別較高,僅次于括號、方括號等,其結(jié)合方向是“自右至左”。關(guān)于結(jié)合方向,將在后面說明。自增(自減)運(yùn)算符的前綴和后綴形式,在表達(dá)
26、式中,有著不同的值,這將是我們在本文討論的主要方面。盡管自增(自減)運(yùn)算與自反賦值運(yùn)算具有相同的賦值效果,但應(yīng)當(dāng)知道,他們是不同的運(yùn)算符,因?yàn)樗鼈兊膬?yōu)先級不一樣,究其原因是,其編譯后的目標(biāo)代碼不同,指令的執(zhí)行周期不同,自增(自減)的執(zhí)行周期小,速度快,效率高。推薦精選因?yàn)樽栽觯ㄗ詼p)運(yùn)算是一種賦值運(yùn)算,因此不能對常量或表達(dá)式進(jìn)行自增(自減)運(yùn)算。二、 自增(自減)運(yùn)算符的幾種使用環(huán)境及其運(yùn)算規(guī)律研究為了研究的方便,我們把出現(xiàn)在表達(dá)式中,或獨(dú)立構(gòu)成語句的一個自增(自減)運(yùn)算式,稱作是一個自增(自減)因式。對于自增或自減運(yùn)算,
27、我們除了關(guān)心自增(自減)的效率外,更重要的,我們關(guān)心的是自增(自減)因式的前綴和后綴兩種形式,所產(chǎn)生的因式的值,及運(yùn)算對象(變量)的值。這是C語言學(xué)習(xí)和教學(xué)中的難點(diǎn),也是C語言水平考試中常見的考點(diǎn)。大體說來,應(yīng)當(dāng)考慮以下幾種使用情況:1 一個自增(自減)因式構(gòu)成一個獨(dú)立語句。形如:k+; 或+k;這樣一個因式構(gòu)成一個獨(dú)立語句時,其前綴形式和后綴形式得到的結(jié)果是一樣的,即得到的因式的值一樣,參與運(yùn)算的變量k的值一樣。例程1:/*test1.c*/main()int k; k=1; k+; /*前綴形式*/printf(“nk=%d”,k); /*驗(yàn)證前綴形式得到的k 值*/k=1;+k; /*后
28、綴形式*/printf(“nk=%d”,k); /*驗(yàn)證后綴形式得到的k 值*/程序中,初值為1的變量k,分別出現(xiàn)在前綴和后綴兩種形式的自增運(yùn)算獨(dú)立語句中,語句執(zhí)行的結(jié)果,使k值都增加為1。實(shí)際上,兩個因式的值都是2。因此可以說,在自增(自減)運(yùn)算構(gòu)成獨(dú)立語句的時候,對自增(自減)運(yùn)算的前綴和后綴的區(qū)分是毫無意義的。推薦精選2 在表達(dá)式中引用同一個變量的一個或多個自增(自減)因式。(1) 在表達(dá)式中只含有一個自增(自減)因式,但表達(dá)式不僅僅包含此因式,還有其他運(yùn)算
29、對象或運(yùn)算符。這種情況,按照各種教材所講授的規(guī)律:表達(dá)式引用此因式時,如是后綴形式,則先引用變量的值(未變化的值)當(dāng)作此因式的值,參與表達(dá)式的運(yùn)算,然后再變化(自增或自減)變量的值,變化了的變量的值不參與表達(dá)式的運(yùn)算。如果是前綴形式,則先進(jìn)行變量的自增(自減)運(yùn)算,然后引用變化了的變量值,參與表達(dá)式的運(yùn)算。例程2:/*test2.c*/main()int k,j;k=5;j=k+; /* 前綴形式的自增運(yùn)算出現(xiàn)在賦值運(yùn)算中*/printf(“(1)k=%d,j=%dn”,k,j);k=5; j=+k; /* 前綴形式的自增運(yùn)算出現(xiàn)在賦值運(yùn)算中*/printf(“(2)k=%d,+k=%dn”,
30、k,j); /*驗(yàn)證前綴形式的運(yùn)算對象和因式的值*/程序的運(yùn)行結(jié)果是:(1)k=6,j=5; /*先把k的初值5拿來用,即賦給變量j.再改變k的初值*/(2)k=6,j=6;/*先完成對k的自增為6,再拿來用,即賦給變量j.*/因此,這種情況下,應(yīng)該描述為;當(dāng)一個自增或自減運(yùn)算出現(xiàn)在表達(dá)式中整體參與運(yùn)算時,應(yīng)遵循后綴形式;先用后變,前綴形式;先變后用的原則。(2) 表達(dá)式中含有兩個或兩個以上的自增(自減)運(yùn)算因式。推薦精選實(shí)際上,當(dāng)多個自加(自減)運(yùn)算出現(xiàn)在同一個
31、表達(dá)式中,系統(tǒng)所進(jìn)行的運(yùn)算遠(yuǎn)沒有一個自增(自減)運(yùn)算因式時簡單。請看如下例程:例程3/*test3.c*/main()int a,k=4,k1,k2,k3,k4; a=(k1=k+)+(k2=k+)+(k3=+k)+(k4=k+); printf("a=%d,k=%dn",a,k); printf("k1=%d,k2=%d,k3=%d,k4=%dn",k1,k2,k3,k4); 運(yùn)行結(jié)果:a=20,k=8k1=5,k2=5,k3=5,k4=5程序的運(yùn)行結(jié)果說明;參與表達(dá)式運(yùn)算的同一個變量的自增(自減)運(yùn)算因式,在表達(dá)式中具有相同的結(jié)果,而參與自增(自減)
32、的變量k的最終結(jié)果與這些因式的結(jié)果并不完全一致。通過大量例程我們可以得到如下的結(jié)論:對于參與表達(dá)式運(yùn)算的各個自增(自減)因式來說,最終的值是一樣的,我們可以這樣解釋其過程:C系統(tǒng)對參與表達(dá)式運(yùn)算的多個自增(自減)因式,按照運(yùn)算的優(yōu)先級,逐一進(jìn)行運(yùn)算掃描,掃描的過程遵循前綴和后綴的規(guī)律,并將最后運(yùn)算的自增(自減)運(yùn)算因式的結(jié)果帶回到各個自增(自減)因式,使得各個自增(自減)因式以相同的值參與表達(dá)式的運(yùn)算。在上述例程中,k1=k+,按照后綴的規(guī)律,先引用k的值,再增加1,使得k1=k+的值暫時為4,計算k2=k+時,沒有使k的值增1,而是繼續(xù)引用k=4,k2=k+的值仍然暫時為4,計算k3=+k時
33、,引用k的當(dāng)前值k=4,因是前綴形式,所以,先增后引,使得k3=k+的值暫時為5,在計算k4=k+時,同理,引用k的當(dāng)前值k=5,因是后綴形式,k4=k+的仍為5。C系統(tǒng)把這最后一個自增(自減)運(yùn)算因式的值,重新帶回到其他自增(自減)運(yùn)算因式,參與表達(dá)式的運(yùn)算,因此使得k1=5,k2=5,k3=5,k4=5。為驗(yàn)證一下這個結(jié)論,我們可以隨意將程序中的各自增(自減)因式修改,改變前后綴形式,改變增或減,均可以分析得出正確的執(zhí)行結(jié)果。對于這種結(jié)論,我們可以概括總結(jié)為一句話:對于表達(dá)式中同一變量的多個自增(自減)因式的值,遵循“逐一掃描,共同引用”的規(guī)律。上述例程3還說明,對于參與自增(自減)運(yùn)算的
34、變量來說,其最終結(jié)果的得出:把該變量的各個自增(自減)運(yùn)算因式,等價于一條一條的自增(自減)語句,按順序執(zhí)行(不考慮其前綴或后綴形式)后,即得到改變量的最終結(jié)果。例如上述例題中,推薦精選k的最終結(jié)果實(shí)際上一下語句順序執(zhí)行的結(jié)果:k=4;k+;k+;+k;k+;。關(guān)于以上分析,我們可以用以下例程再次加以驗(yàn)證,請讀者依照上述規(guī)律說明加以分析:例程4:/*test4.c*/main() int a,k=4,k1,k2,k3,k4; a=(k1=k+)+(k2=k-)+(k3=k+)+(k4=k+); printf("a=%d,k=%dn",a,k); printf("k
35、1=%d,k2=%d,k3=%d,k4=%dn",k1,k2,k3,k4); 程序運(yùn)行結(jié)果:a=16,k=6k1=4,k2=4,k3=4,k4=43 含有多個自增(自減)因式的表達(dá)式當(dāng)作函數(shù)參數(shù)時的情形在printf()函數(shù)中,要輸出一個含有多個自增(自減)因式的表達(dá)式的值,此時,盡管多個自增(自減)因式出現(xiàn)在一個表達(dá)式中,但由于是在printf()函數(shù)中,其運(yùn)算的規(guī)律稍有變化。請看如下例程:例程5:main()int a,k=4,k1,k2,k3,k4; printf("a=%d,k=%dn",a=(k1=k+)+(k2=k-)+(k3=k+)+(k
36、4=k+),k); printf("k1=%d,k2=%d,k3=%d,k4=%dn",k1,k2,k3,k4); 程序運(yùn)行結(jié)果:a=18,k=4k1=4,k2=5,k3=4,k4=5上述例程中,printf()函數(shù)中的輸出對象,雖然也是一個表達(dá)式,并且含有多個自增(自減)運(yùn)算因式,但各因式值的分析與表達(dá)式語句中有所不同,我們通過程序的運(yùn)行結(jié)果可以看到,輸出的表達(dá)式的各因式,其值依賴于當(dāng)前的推薦精選k值,當(dāng)前k值的求得,不僅與自增(自減)運(yùn)算的前后綴形式有關(guān),而且也與上一個運(yùn)算的自增自減因式的k 有關(guān)。實(shí)際上,在printf()函數(shù)中輸出的表達(dá)式中,多個自增(自減)因式,相當(dāng)于多個自增(自減)語句,C系統(tǒng)按照優(yōu)先級的先后順序,依次執(zhí)行,依次求得各因式中的k值和因式的值,并立即將這個因式的值用于整個表達(dá)式的運(yùn)算中,而不像上述例程3與例程4那樣,將最后一個因式的值帶回到前面的各因式。實(shí)驗(yàn)證明:當(dāng)用其它函數(shù)進(jìn)行同樣的試驗(yàn)時,得出的結(jié)論是一樣的,因此,我們可以把上述試驗(yàn)結(jié)論推廣為含有多個自增(自減)因式的表達(dá)式當(dāng)作函數(shù)參數(shù)的情形。另外需要注意:在C程序中,函數(shù)含有多個參數(shù)時,其參數(shù)的運(yùn)算順序是
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度職工住房借款與社區(qū)養(yǎng)老配套服務(wù)協(xié)議3篇
- 二零二五年度吊裝工程安全評估與監(jiān)督管理合同2篇
- 2025年辦公家具回收利用與環(huán)保處理合同3篇
- 極簡市場營銷(杰瑞20231224)
- 二零二五年度花椒采摘與旅游融合發(fā)展合同3篇
- 2024年陽泉煤業(yè)(集團(tuán))有限責(zé)任公司總醫(yī)院三礦醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 2024年河南水利與環(huán)境職業(yè)學(xué)院高職單招數(shù)學(xué)歷年參考題庫含答案解析
- 2024年河北機(jī)電職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- 二零二五年度美食街?jǐn)偽蛔赓U及廣告投放合同3篇
- 2024年江蘇財經(jīng)職業(yè)技術(shù)學(xué)院高職單招職業(yè)適應(yīng)性測試歷年參考題庫含答案解析
- (完整word版)學(xué)校就讀證明
- 植物種植施工方案與技術(shù)措施
- 第六章傳質(zhì)基本概念
- 空調(diào)工程竣工驗(yàn)收單(共1頁)
- API-685-中文_
- STM32固件庫使用手冊(中文版)
- LORCH焊機(jī)簡要操作說明書-v2.1
- 造林監(jiān)理規(guī)劃
- 服裝品質(zhì)管理人員工作手冊
- 《名詞冠詞代詞》PPT課件
- 鍋爐安裝表格(全套)
評論
0/150
提交評論