首頁 >後端開發 >C++ >為什麼 C 中 std::cout 參數求值順序不可預測?

為什麼 C 中 std::cout 參數求值順序不可預測?

Susan Sarandon
Susan Sarandon原創
2024-12-26 15:46:26348瀏覽

Why is std::cout Argument Evaluation Order Unpredictable in C  ?

計算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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn