大家先來看這樣一個小程序
- #include <stdio.h>
- main()
- {
- int i=5, b;
- b= (++i) + (++i) + (++i) + (++i);
- }
問程序執行後b的值是多少?
請你先不要用編譯器,自己算一下,然後再運行程序看一下,可能你會發現你算的結果和編譯器的結果並不一樣!
不信你可以自己試試。(如果你算對了就不要往下看文章了)
有人說我這樣很無聊,誰也不會這麼寫程序,哪會犯這樣的錯誤。
如果您也這麼覺得,那你也沒必要往下看了,如果您覺得有必要追究一下這個問題,那麼就繼續看一下吧!
我問過大概20個人這個問題,他們有的是大齡程序員,有的是大學生,有的是資深C語言教師,但這20個人裏很不幸,沒有一個人答對了這個問題,但有人強調這是編譯器的不同,卻又沒有人找出不同結果的編譯器。
於是我自己寫了這個程序逆向了一下,看到程序是這樣執行的。
首先i執行了2次自加操作,目的是結合第一個“+”運算符計算和值,然後i又執行了一次自加,目的是結合第二個“+”,最後i又自加了一次結合最後一個“+”輸出結果。
結果是b=7+7+8+9=31;
GCC4.0和VC6.0的運算方式基本相同,只是VC編譯後執行過程多用了幾個寄存器,自加的時候用ADD指令,而GCC只用一個EAX寄存器,自加的時候用INC指令來完成。
那麼現在這種算式的規律就是,每遇到一個“+”運算符,先把左邊計算完成後再與右邊的終值相加。
文章說到這裏就應該清楚了,這其實是個很淺顯的問題,我希望看過這篇文章的朋友以後不會再犯和我一樣的錯誤了,這個問題是剛學C語言的學生問我的,我卻很從容的答錯了,真的比較丟人啊!呵呵!
歡迎感興趣的朋友和我一起討論,或許您有另一番理解。