自加運算的誤區!

大家先來看這樣一個小程序

  1. #include <stdio.h>
  2. main()
  3. {
  4.        int i=5, b;
  5.        b= (++i) + (++i) + (++i) + (++i);
  6. }

 

問程序執行後b的值是多少?

請你先不要用編譯器,自己算一下,然後再運行程序看一下,可能你會發現你算的結果和編譯器的結果並不一樣!

不信你可以自己試試。(如果你算對了就不要往下看文章了)

 

有人說我這樣很無聊,誰也不會這麼寫程序,哪會犯這樣的錯誤。

如果您也這麼覺得,那你也沒必要往下看了,如果您覺得有必要追究一下這個問題,那麼就繼續看一下吧!

我問過大概20個人這個問題,他們有的是大齡程序員,有的是大學生,有的是資深C語言教師,但這20個人裏很不幸,沒有一個人答對了這個問題,但有人強調這是編譯器的不同,卻又沒有人找出不同結果的編譯器。

於是我自己寫了這個程序逆向了一下,看到程序是這樣執行的。

 

首先i執行了2次自加操作,目的是結合第一個“+”運算符計算和值,然後i又執行了一次自加,目的是結合第二個“+”,最後i又自加了一次結合最後一個“+”輸出結果。

結果是b=7+7+8+9=31;

 

GCC4.0和VC6.0的運算方式基本相同,只是VC編譯後執行過程多用了幾個寄存器,自加的時候用ADD指令,而GCC只用一個EAX寄存器,自加的時候用INC指令來完成。

 

那麼現在這種算式的規律就是,每遇到一個“+”運算符,先把左邊計算完成後再與右邊的終值相加。

 

文章說到這裏就應該清楚了,這其實是個很淺顯的問題,我希望看過這篇文章的朋友以後不會再犯和我一樣的錯誤了,這個問題是剛學C語言的學生問我的,我卻很從容的答錯了,真的比較丟人啊!呵呵!

 

歡迎感興趣的朋友和我一起討論,或許您有另一番理解。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章