首页 > 后端开发 > C++ > 什么决定了 `std::cout` 中参数的求值顺序?

什么决定了 `std::cout` 中参数的求值顺序?

Barbara Streisand
发布: 2024-12-25 11:44:33
原创
536 人浏览过

What Determines the Evaluation Order of Arguments in `std::cout`?

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板