ホームページ >バックエンド開発 >C++ >引数の評価順序は C の `std::cout` 出力にどのように影響しますか?

引数の評価順序は C の `std::cout` 出力にどのように影響しますか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-01 10:45:111036ブラウズ

How Does Argument Evaluation Order Affect `std::cout` Output in C  ?

std::cout 引数の評価順序

std::cout に渡される引数の評価順序は、特に混乱を招く可能性があります。 1 つ以上の引数が、別の引数の値を変更する関数呼び出しである場合argument.

コード例

次の C コード スニペットを考えてみましょう:

#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

foo 関数が呼び出された後、test の値が 1 になると予想されるため、この出力は意外に思えるかもしれません。

説明

std::cout の引数の評価順序は、論理演算子などのいくつかの特殊な場合を除き、C 標準では指定されていません。 (&&, ||) および三項演算子 (? :).

この例では、コンパイラーは選択した順序で自由に引数を評価できます。この場合、foo 関数が最初に評価され、test の値が 1.0 に変更されます。ただし、 std::cout ステートメントは foo 関数が呼び出される前に評価されるため、std::cout ステートメントに格納されている test の値は 0.0 のままです。

Solution

望ましい評価順序を確保するには、コードを次のように書き直す必要があります。

std::cout << "Value of test before function call: " << test << std::endl;
foo(test);
std::cout << "Value of test after function call: " << test << std::endl;

これにより、foo 関数呼び出しの前後でテストが確実に評価され、期待される出力が生成されます:

Value of test before function call: 0
Value of test after function call: 1

以上が引数の評価順序は C の `std::cout` 出力にどのように影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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