簡體   English   中英

函數調用序列(C ++)

[英]Sequence of function calls (C++)

result= function_1()*function_2();

我正在寫一個像上面這樣的代碼。 我想知道的是在進行乘法時,首先調用哪個函數? 這是因為,第一個被調用的函數可以影響從另一個函數返回的結果。 我假設首先調用function_1() ,當我嘗試時,我看到它確實如此。 但是,總是如此嗎? 是否取決於我使用的編譯器或我使用的系統?

C ++(或C)標准未指定評估順序(參見Vlad的回答 )。 如果你的function_1function_2有明顯的副作用 ,它可能會成為你應該絕對避免的一些未指明的行為 (就像你應該避免未定義的行為 )。 在某些情況下(具有強大優化功能的內聯函數),計算可能會混雜在一起。

想想像奇怪的情況

 static int i;
 int function_1(void) { i++; return i; }
 int function_2(void) { i+=2; return 3*i+1; }

它可能是特定於實現的,可能取決於實際的編譯器和優化標志。

您應該編寫代碼,好像函數調用的順序是完全隨機的並且不可重現(即使在實踐中它可能是可重現的)。 同樣,您不應該期望任何特定的參數評估順序(例如,在f(i++, ++j)您不知道ij是否已經先遞增),即使對於給定的編譯器,該訂單可能是固定的。 同樣,您應該想象一個完全隨機且不可重現的順序。

正如David Schwartz評論的那樣,如果您關心訂單,則應該明確編寫一些序列點

最后,如果您的代碼依賴於某些順序,則它完全不可讀,並且出於簡單的可讀性原因,您應該避免以這種方式編碼。

根據C ++標准(1.9程序執行)

15除非另有說明,否則對單個算子的操作數和個別表達式的子表達式的評估是不確定的。

所以在這個表達中

result= function_1()*function_2();

一些編譯器可以首先評估function_1()然后是function_2(),而其他編譯器可以先評估function_2()然后再評估function_1()。 即使你寫得像

result= (function_1())*(function_2());

要么

result= (function_1())*function_2();

要么

result= function_1()*(function_2());

相對於操作數的評估順序,什么都不會改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM