std::cout 参数的求值顺序
传递给 std::cout 的参数的求值顺序可能会令人困惑,尤其是当一个或多个参数是修改另一个参数值的函数调用时。
代码示例
考虑以下 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
这个输出可能看起来令人惊讶,因为人们可能期望 test 的值调用 foo 函数后为 1。
说明
C 标准没有指定 std::cout 中参数的求值顺序,除了 a一些特定情况,例如逻辑运算符(&&、||)和三元运算符(? :)。
在此示例中,编译器是可以按照它选择的任何顺序自由地评估参数。在本例中,首先评估 foo 函数,将 test 的值修改为 1.0。但是,std::cout 语句中存储的 test 值仍然是 0.0,因为 std::cout 语句是在调用 foo 函数之前计算的。
解决方案
为了确保所需的评估顺序,代码应重写如下:
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中文网其他相关文章!