#include <iostream>using namespace std;int main(){ int i=0;
cout<<i++<<" "<<i++<<endl;//輸出1 0
i=0;
cout<<++i<<" "<<++i<<endl;//輸出2 2}
2 回答

MMTTMM
TA貢獻1869條經驗 獲得超4個贊
請不要再糾結這種和編譯器細節有關的東西了,因為第一你不需要了解,第二如果你需要了解那只能是你在寫這個編譯器,第三你了解的再多也可能和平臺、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++);

隔江千里
TA貢獻1906條經驗 獲得超10個贊
我記得曾經有過這樣一個問題,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++也好只是一種標準,每個編譯器在不違反標準的前提下有自己實現的辦法,所以在寫代碼的時候注意不要寫這種模棱兩可的東西,不然移植性太差,以及容易出各種問題。事實上也沒必要深究,除非是研究需要之類的。
- 2 回答
- 0 關注
- 160 瀏覽
添加回答
舉報
0/150
提交
取消