为自增(++)自减(--)运算符正名
學(xué)過C語言的朋友,相信你對(duì)“++i”,“- -i”,“i++”,“i- -”這樣的表達(dá)式并不陌生,可是你真正明白其中的含義嗎?
我發(fā)現(xiàn)在網(wǎng)上,充斥著對(duì)它們的誤解,或者說似是而非的,似懂非懂的理解。我先舉例一二。
一個(gè)來自于網(wǎng)上的例子(代碼排版我修改了一下,這樣符合我的閱讀習(xí)慣):
輸出結(jié)果:
a=11, a1=11
b=21, b1=20
c=29, c1=29
d=39, d1=40
文中是這樣解釋的:
a、b、c、d 的輸出結(jié)果相信大家沒有疑問,下面重點(diǎn)分析a1、b1、c1、d1:
1) 對(duì)于a1=++a,先執(zhí)行++a,結(jié)果為11,再將11賦值給a1,所以a1的最終值為11。而a經(jīng)過自增,最終的值也為11。
2) 對(duì)于b1=b++,b的值并不會(huì)立馬加1,而是先把b原來的值交給b1,然后再加1。b原來的值為20,所以b1的值也就為20。而b經(jīng)過自增,最終值為21。
3) 對(duì)于c1=- -c,先執(zhí)行- -c,結(jié)果為29,再將29賦值給c1,所以c1的最終值為29。而c經(jīng)過自減,最終的值也為29。
4) 對(duì)于d1=d- -,d的值并不會(huì)立馬減1,而是先把d原來的值交給d1,然后再減1。d原來的值為40,所以d1的值也就為40。而d經(jīng)過自減,最終值為39。
可以看出:
a1=++a; 會(huì)先進(jìn)行自增操作,再進(jìn)行賦值操作;
而b1=b++; 會(huì)先進(jìn)行賦值操作,再進(jìn)行自增操作。
c1=- -c; 和 d1=d- -; 也是如此。
網(wǎng)上還有這樣的理解:
如果++或- -放在操作數(shù)前面就先進(jìn)行自增或自減,再進(jìn)行其他運(yùn)算;
如果++或- -放在操作數(shù)后面就先進(jìn)行其他運(yùn)算,再進(jìn)行自增或自減。
我覺得,雖然按照上文的解釋可以分析出正確的答案,但是不夠“專業(yè)”。
請(qǐng)看比較專業(yè)的解釋(以++為例):
后綴遞增
一個(gè)基本表達(dá)式(用E表示)的后面加上運(yùn)算符“++”,就可以構(gòu)成后綴遞增表達(dá)式。 例如:
int i=0; int j=0; j = i++; //合法 int *p = &i; (*p)++; //合法后綴遞增表達(dá)式的結(jié)果不是左值,它的值是E所指示的對(duì)象在遞增操作前的原值,而不是遞增后的新值;
后綴遞增是具有副作用的表達(dá)式,這個(gè)副作用會(huì)修改E所指示的對(duì)象,將它的存儲(chǔ)值變?yōu)楸磉_(dá)式E+1的值;
E要求是實(shí)數(shù)類型或者指針類型,而且必須是可以修改的左值,所以像“250++”這樣的表達(dá)式是非法的;
后綴遞增表達(dá)式的結(jié)果類型和E的類型相同。
特別要指出:后綴++運(yùn)算符的值的計(jì)算和它的副作用有確定的前序和后序關(guān)系,也就是說是先計(jì)算和得到后綴運(yùn)算符++的值(這也是整個(gè)后綴遞增表達(dá)式的值),再修改其操作數(shù)的存儲(chǔ)值。
int i=0; int j=1; j = i++;對(duì)于j = i++;
是要把i++這個(gè)表達(dá)式的值賦值給j; 而i++這個(gè)表達(dá)式的值是i所指示的對(duì)象在遞增操作前的原值(也就是0),所以這條語句執(zhí)行后,j=0;
同時(shí),i++這個(gè)表達(dá)式是有副作用的,副作用就是i的存儲(chǔ)值增加1,于是i變?yōu)?;
需要強(qiáng)調(diào)的是,i++這個(gè)表達(dá)式的值的計(jì)算和i的遞增是有先后順序的:先計(jì)算i++這個(gè)表達(dá)式的值 (=0),再遞增i (遞增后i=1).
前綴遞增
運(yùn)算符++加上一個(gè)表達(dá)式E,即可構(gòu)成前綴遞增表達(dá)式。
例如:
前綴遞增表達(dá)式的結(jié)果不是左值,它的值是E所指示的對(duì)象在遞增操作后的新值,即它在數(shù)值上等于表達(dá)式E+1的值;
前綴遞增是具有副作用的表達(dá)式,這個(gè)副作用會(huì)修改E所指示的對(duì)象,將它的存儲(chǔ)值變?yōu)楸磉_(dá)式E+1的值;
E要求是實(shí)數(shù)類型或者指針類型,而且必須是可以修改的左值,所以像++++i這樣的表達(dá)式是非法的;
前綴遞增表達(dá)式的結(jié)果類型和E的類型相同。
在語義上,前綴遞增表達(dá)式++E等價(jià)于表達(dá)式E += 1;
(完)
參考資料:《標(biāo)準(zhǔn)C語言指南》(李忠,電子工業(yè)出版社)
總結(jié)
以上是生活随笔為你收集整理的为自增(++)自减(--)运算符正名的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity3d 剧情制作_游戏设计作品集
- 下一篇: zabbix api java_zabb