首頁 >後端開發 >C++ >為什麼 `std::cout` 中參數求值的順序未指定,如何確保輸出一致?

為什麼 `std::cout` 中參數求值的順序未指定,如何確保輸出一致?

Linda Hamilton
Linda Hamilton原創
2024-12-18 20:13:14224瀏覽

Why is the Order of Argument Evaluation in `std::cout` Unspecified, and How Can I Ensure Consistent Output?

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 : 1

但是,實際輸出可能會因編譯器和平台的不同而有所不同。程式碼可能會列印:

Value of test is :      1       Return value of function is : 1 Value of test : 0

這是因為 std::cout 語句中參數的求值順序未定義。在第一種情況下,test 在 foo() 呼叫之前評估,因此它會列印 1。在第二種情況下,test 在 foo() 呼叫之後評估,因此它會列印 0。

確保正確的排序,將表達式拆分為多個語句:

double test_after_foo = foo(test);
std::cout << "Value of test is : \t" << test << "\tReturn value of function is : " << test_after_foo << "\tValue of test : " << test_after_foo << std::endl;

這保證了foo(test) 在std::cout 語句之前計算,從而在不同編譯器之間提供一致的輸出平台。

以上是為什麼 `std::cout` 中參數求值的順序未指定,如何確保輸出一致?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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