首页 >后端开发 >C++ >参数求值顺序如何影响 C 中的'std::cout”输出?

参数求值顺序如何影响 C 中的'std::cout”输出?

Susan Sarandon
Susan Sarandon原创
2025-01-01 10:45:111023浏览

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

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn