ホームページ >バックエンド開発 >C++ >`std::cout` の引数評価の順序が指定されていないのはなぜですか? 一貫した出力を保証するにはどうすればよいですか?

`std::cout` の引数評価の順序が指定されていないのはなぜですか? 一貫した出力を保証するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-18 20:13:14239ブラウズ

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 が出力されます。2 番目のケースでは、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;

これにより、std::cout ステートメントの前に foo(test) が評価されることが保証され、異なるコンパイラ間で一貫した出力が提供されます。およびプラットフォーム。

以上が`std::cout` の引数評価の順序が指定されていないのはなぜですか? 一貫した出力を保証するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。