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++中都不能作左值。