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