徹底搞清 C/C++中a++與++a的區別

首先 a++和++a 的定義:看個例子
A:    a=5;  b=++a; // 相當於a=a+1;b=a;  結果是a=6,b=6
B:    a=5;  b=a++; // 相當於b=a;a=a+1; 結果是a=6,b=5
所以書上有:
 (1)   如果用前綴運算符對一個變量增1(減1),則在將該變量增1(減1)後,用新值在表達式中進行其他的運算。
 (2)   如果用後綴運算符對一個變量增1(減1),則用該變量的原值在表達式中進行其他的運算後,再將該變量增1(減1)後。

這裏就有個問題,對於後綴運算,”用該變量的原值在表達式中進行其他的運算後“該如何理解,也就是說啥時纔算表達式運算完啦。
舉個列子:求a的最終值
int a=3;
a+=a+=a++*a--;
計算過程如下:
先算a++*a-- 
由於a=3 
a++等於3 //這裏後綴++中的第二步自加運算還沒有進行
a--等於3 //這裏後綴--中的第二步自減運算還沒有進行
所以 ++*a-- 等於9
a+=a++*a-- 等於a+=9等於a=a+9=3+9=12
在算a+=a 等於a=a+12=12+12=24 
然後在進行再後綴++中的第二步自加運算和後綴--中的第二步自減運算
即進行 a=a+1;此時a=25;再進行a=a-1;此時a=24 所以最終a=24

說明在一個表達中,無論有多少個等號(賦值號)都必須進行完所有的運算符後,才能進行後綴自加,自減。那麼什麼時候才能
算本計算單位已經結束。下面某些摘自《C語言深度剖析》
i++ 在遇到每個逗號,分號後,才認爲本計算單位已經結束,i 這時候自加。
關於逗號表達式與“++”或“--”的連用,還有一個比較好的例子:
int x;
int i = 3;x = (++i, i++, i+10);
問 x的值爲多少?i的值爲多少?
按照上面的講解,可以很清楚的知道,逗號表達式中,i 在遇到每個逗號後,認爲本計算
單位已經結束,i 這時候自加。所以,本例子計算完後,i的值爲5,x的值爲 15。

關於符號的貪心法
C 語言有這樣一個規則:每一個符號應該包含儘可能多的字符。也就是說,編譯器將程
序分解成符號的方法是,從左到右一個一個字符地讀入,如果該字符可能組成一個符號,
那麼再讀入下一個字符,判斷已經讀入的兩個字符組成的字符串是否可能是一個符號的組
成部分;如果可能,繼續讀入下一個字符,重複上述判斷,直到讀入的字符組成的字符串
已不再可能組成一個有意義的符號。這個處理的策略被稱爲“貪心法” 。需要注意到是,除
了字符串與字符常量,符號的中間不能嵌有空白(空格、製表符、換行符等) 。比如:==是單個符號,而==是兩個等號。
   按照這個規則可能很輕鬆的判斷 a+++b表達式與 a++ +b一致。那++i+++i+++i;會被解
析成什麼樣子呢?希望讀者好好研究研究。另外還可以考慮一下這個表達式的意思a+++++b?

分析:
++i+++i+++i   由於後綴自增,自減優先級比前綴高(ANSI/ISO C++中)編譯器等效理解
爲++(i++)+(i++)+i,而i++不可以作左值所以++(i++)錯誤,故此表達式錯誤
a+++++b   編譯器將其理解爲(a++)++ +b, 由於a++不可以作左值所以(a++)++錯誤,故此表達式錯誤 

另外特別注意 ++i在C中不是左值,在C++中才是。在C語言中像 int i=0,a=2,b=3;++i=a+b;這個表達式是非法的。
i++在C和C++中都不能作左值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章