Evaluation Order in std::cout
Confusion often arises regarding the order of argument evaluation when using std::cout's insertion operator. Consider the following code snippet:
#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 中,表达式元素的求值顺序是不确定的(除了一些特殊情况,如 && 和 || 运算符以及引入顺序点的三元运算符)。因此,不能保证 test 会在 foo(test)(会修改 test 的值)之前或之后求值。
解决方法
如果代码依赖于特定的求值顺序,最简单的方法是在多个单独的语句中分割表达式,如下所示:
std::cout << "Value of test is: \t" << test << std::endl; foo(test); std::cout << "Return value of function is: " << foo(test) << std::endl; std::cout << "Value of test: " << test << std::endl;
这样,求值顺序将明确定义为从上到下。
以上是什么决定了 `std::cout` 中参数的求值顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!