計算std::cout 插入順序中的參數
在C 中,使用std::cout 插入的表達式中參數計算的順序運算子可能會令人困惑。考慮以下程式碼片段:
#include <iostream> bool foo(double &m) { m = 1.0; return true; } int main() { double test = 0.0; std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << foo(test) << "\tValue of test : " << test << std::endl; return 0; }
這段程式碼的輸出令人驚訝:
Value of test is : 1 Return value of function is : 1 Value of test : 0
理解這個輸出需要深入研究參數求值的順序。
未指定的評估順序
通常,C 不指定表達式中參數的求值順序。這由編譯器決定。但是,也有一些例外,例如:
從左到右評估假設
它是通常假設std::cout插入是從左到右評估的,但這並不能保證。在我們的範例中,第三個參數中的「影子」測試在呼叫 foo 之前進行評估,這會修改它。
解決混亂
以確保預期的結果求值順序,將表達式拆分成單獨的語句:
double test = 0.0; std::cout << "Value of test is : \t" << test << std::endl; std::cout << "Return value of function is : " << foo(test) << std::endl; std::cout << "Value of test : " << test << std::endl;
此程式碼拆分成單獨的語句:
Value of test is : 0 Return value of function is : 1 Value of test : 1此程式碼正確輸出:
以上是為什麼 C 中 std::cout 參數求值順序不可預測?的詳細內容。更多資訊請關注PHP中文網其他相關文章!