精華區beta Programming 關於我們 聯絡資訊
※ 引述《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