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 サイトの他の関連記事を参照してください。