※ 引述《aecho (星空下的鮪魚)》之銘言:
: ※ 引述《khoguan (Khoguan Phuann)》之銘言:
: : int i = 0;
: : cout << i << ' ' << i++; // 不同機器有不同結果,但並不違反標準
: 可以請教一下嗎?
: 所以 cout << ... << .... ;
: 並不一定是從右邊執行到左邊囉 ??
: 而是要看是哪一家的compiler
: 並且依他們如何實作嗎 ??
恩。其實這種問題很多地方都會發生。不止是<<
簡單的function call就會遇到了(雖然你也可以想像<<也是function call)
如
void test(int a,int b,int c,int d,int e,int f,int g){
cout<<"a:"<<a<<" b:"<<b<<" c:"<<c<<" d:"<<d<<" e:"<<e
<<" f:"<<f<<" g:"<<g<<endl;
}
int main(void){
int sek=0;
test(++sek,++sek,++sek,++sek,++sek,++sek,++sek);
return 0;
}
這樣的東西,基本上要怎麼去執行。跟本就沒有定義。
沒人規定function call要從那個去取值。所以能避免
就盡量避免。
不過話雖如此。其實還是有跡可尋的。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_
core_results_of_calling_example.asp
(太長自己接)
我在gcc 3.3.3底下編譯。
__stdcall 取值順序是g->f->e...->a
__cdecl 同stdcall
__fastcall 則是b->a->g->f...->c
跑出來的結果。會因為call法的不同。而有不同。
應該是compiler最佳化為了達到call的要求,而先行取得b與a
(b與a要放於register)
其他則由後取到前(先堆後面再放到前)。
但這並不是絕對。因為並沒有絕對的定義,來定義取值的順序。
最後..只能這麼說,盡量少寫這樣會有奇異性的程式..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.104.34.29