#include <iostream> using namespace std; int main(){ int i=0; cout<<i++<<" "<<i++<<endl;//输出1 0 i=0; cout<<++i<<" "<<++i<<endl;//输出2 2 }
对以上代码的输出如何解释?不太明白(编译环境为VS2010)
认证高级PHP讲师
讚同藍皮鼠說的,請不要再糾結這種和編譯器細節有關的東西了,因為第一你不需要了解,第二如果你需要了解那隻能是你在寫這個編譯器,第三你了解的再多也可能和平台、CPU等有關係——他們隨時可以變化。一句話,這不是推薦的代碼風格,請避免這種寫法。
我在我的Mac上用i686-apple-darwin11-llvm-g -4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)測試,結果和你說的一樣。
可能出現這種情況的理由是:
cout<<i++<<" "<<i++<<endl;//输出1 0
等價於
operator<<( operator<<( operator<<(cout, i++), " "), i++);
關於C 裏麵的執行細節,參見http://en.wikipedia.org/wiki/Sequence...,而上面这个函数表现的和你想的不一样,是因为函数参数的evaluation顺序没有定义,编译器可以做它自己想做的优化,比如就先把外层函数调用的参数i evaluate成0,i变成了1,然后内层调用再得到的就是i==1了。
不要再糾結這種和編譯器處理非常相關的問題了,現實世界裏基本不會遇到這樣的場景。 好吧 既然被踩了就多說幾句,這種傻逼情景應該隻會在天朝的考試和國內作者出的垃圾書上出現。
我記得曾經有過這樣一個問題,C語言中:
#include <stdio.h> int main() { int a, b; a = 2; b = (++a) * (++a) * (++a); printf("%d\n", b); return 0; }
gcc輸出結果是80,但是TC的結果是60。據我們幾個人推測原因是,gcc編譯器是這樣處理的:
a = ++a; //a == 3 a = ++a; //a == 4 b = a * a //b == 4 * 4==16 a = ++a; //a == 5 b = b * a; //b == 16 * 5 == 80
而TC編譯器是這樣處理的:
a = ++a; //a == 3 b = 3 * (++a); a = ++a; //a == 4 b = 3 * 4; a = ++a; //a == 5 b = b * a; //b == 12 * 5 == 60
個人理解呢,C語言也好C 也好隻是一種標準,每個編譯器在不違反標準的前提下有自己實現的辦法,所以在寫代碼的時候注意不要寫這種模棱兩可的東西,不然移植性太差,以及容易出各種問題。事實上也沒必要深究,除非是研究需要之類的。
讚同藍皮鼠說的,請不要再糾結這種和編譯器細節有關的東西了,因為第一你不需要了解,第二如果你需要了解那隻能是你在寫這個編譯器,第三你了解的再多也可能和平台、CPU等有關係——他們隨時可以變化。一句話,這不是推薦的代碼風格,請避免這種寫法。
我在我的Mac上用i686-apple-darwin11-llvm-g -4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)測試,結果和你說的一樣。
可能出現這種情況的理由是:
等價於
關於C 裏麵的執行細節,參見http://en.wikipedia.org/wiki/Sequence...,而上面这个函数表现的和你想的不一样,是因为函数参数的evaluation顺序没有定义,编译器可以做它自己想做的优化,比如就先把外层函数调用的参数i evaluate成0,i变成了1,然后内层调用再得到的就是i==1了。
不要再糾結這種和編譯器處理非常相關的問題了,現實世界裏基本不會遇到這樣的場景。
好吧 既然被踩了就多說幾句,這種傻逼情景應該隻會在天朝的考試和國內作者出的垃圾書上出現。
我記得曾經有過這樣一個問題,C語言中:
gcc輸出結果是80,但是TC的結果是60。據我們幾個人推測原因是,gcc編譯器是這樣處理的:
而TC編譯器是這樣處理的:
個人理解呢,C語言也好C 也好隻是一種標準,每個編譯器在不違反標準的前提下有自己實現的辦法,所以在寫代碼的時候注意不要寫這種模棱兩可的東西,不然移植性太差,以及容易出各種問題。事實上也沒必要深究,除非是研究需要之類的。