在跟隨傳智播客的視頻學習后置++和--的時候:
int age = 18;
int sum = (age++ + 12) * 3 - 10;
//上面這句話相當于
//int sum = (age + 12) * 3 - 10;
//age++;
然后我得出結論: 無論所在的表達式有多么復雜,都要先等表達式計算結束后,才會執行++或者--的運算。
單看上面的代碼,這個結論沒有錯誤,先拿age的值去參與運算,然后再執行age++。之所以會得出這樣的結論是因為對后置++的理解有問題。
后置++ -- 它們的運算規則是這樣的:先讓變量原先的值參與運算,然后在執行++或者--。而我對這個規則的理解是:先讓變量原先的值參與運算,等待整個表達式運算結束后,再執行++或者--
因為上面的代碼中,age這個變量在表達式中只出現了一次,如果age出現了多次就不是這樣的結果了!!!
所以,我對后置++ -- 執行的時機理解有錯,不是要等到整個表達式運算結束,而是在變量的原值被帶入表達式后,就執行了后置++或者--。
后置++ -- 常常作為筆試的考試題出現,下面我們來看2個題目。
int a = 5;
int b = a++ + (++a) * 2 + ++a;
Console.WriteLine("a = {0}", a); // 8
Console.WriteLine("b = {0}", b); // 27
解題時,需按照計算機的思路進行,計算機是這樣理解的。就是要按照運算符的優先級來解題。如果還堅持錯誤的理解的話,這道題非錯不可。
int num = 5;
int num2 = (num++ + (++num * 2)) + ++num;
++在后,num的值依舊為5(不是等+運算執行完后,再執行++;在num參與+運算后,就會執行++)
num = num + 1; // 6
num = num + 1; // 7
執行了兩次++,num = 7 (按照自己錯誤理解,num只會執行一次++)
5 + 7 * 2
num = num + 1; // 8
num2 = 5 + 7 * 2 + 8 = 27
第2中解法,我們可以將這個表達式拆分成幾個等價的表達式。 這里c的值與 int b = a++ + (++a) * 2 + ++a; 的運算結果完全相同,x的值也是8。拆分復雜的表達式的時候,一般是按照表達式的運算順序來分解的。
int x = 5;
int c = x++;
c = c + (++x) * 2;
c = c + ++x;
Console.WriteLine("x = {0}", x); // 8
Console.WriteLine("c = {0}", c); // 27
int a = 3;
int b = 0, c = 0, d = 0;
b = (a++) + (a++) + (a++); // 3 + 4 + 5 = 12 , a = 6
c = (++a) + (++a) + (++a); // 7 + 8 + 9 = 24 , a = 9
d = (++a) + (a++) + (++a); // 10 + 10 + 12 = 32, a = 12
Console.WriteLine("a = {0}", a);
Console.WriteLine("b = {0}", b);
Console.WriteLine("c = {0}", c);
Console.WriteLine("d = {0}", d);
這一題,我們就可以使用拆分法來解決,這樣我們就可以看到a的值是如何變化的。
值得注意的是后置++的優先級比前置++的優先級要高,所以 int x = 1; int y = x +++ x; y的值應該怎么運算呢,是 y = x + (++x)還是 y = (x++) + x呢?
在VS中輸入int y = x+++x 之后,當我們輸入 ; 后,會發現,VS將表達式寫成了 int y = x++ + x; 也就是說 y = (x++) + x;
感謝 鄒瓊俊 同學的文章 程序員的基礎和解決問題的思維很重要,我在溫習的時候,及時地發現了自己過去的錯誤。立此博文為記錄!
文章列表