【问题标题】:Why variable, passed to a function by reference, doesn't immediately change its value? [duplicate]为什么通过引用传递给函数的变量不会立即改变其值? [复制]
【发布时间】:2021-02-27 14:43:20
【问题描述】:

下面是代码(程序用指定的外半径和内半径计算环的面积,没什么特别的):

#include <iostream>

bool f(double ro, double ri, double &s) 
{
    const double eps = 1e-12;
    if (ro > ri + eps) 
    {
        const double pi = acos(-1);
        //s = pi * (ro * ro) - pi * (ri * ri);
        s = pi * (ro + ri) * (ro - ri);
        return true;
    }
    return false;
}

int main()
{
    double s = 0;
    double ro, ri;  
    std::cin >> ro >> ri;
    std::cout << f(ro, ri, s) << ' ' << s << '\n'; 
    std::cout << s;
}

问题是,为什么,例如,对于输入 5 4 输出将是

1 0
28.2743

,不是

1 28.2743
28.2743

?

【问题讨论】:

  • 参数的求值顺序在 C++ 中不固定。编译器可以先评估s,然后再调用f
  • 在 C++17 之前,情况更糟,因为允许在不同参数的计算之间进行交错。但是,从 C++17 开始,有一些保证:例如在a = b; 中,左侧将在右侧之后进行评估。
  • 实际上,从 C++17 开始,&lt;&lt; 也有保证。尝试使用 C++17 标准编译您的代码。另请参阅here
  • @yeputons 是的,启用了 c++17,它按预期工作,非常感谢! x)

标签: c++ output


【解决方案1】:

Order of evaluation rules 已经进化,特别是在 C++17 中为 E1 &lt;&lt; E2

std::cout << f(ro, ri, s) << ' ' << s << '\n';

保证在 C++17 中按预期顺序(E1 &lt;&lt; E2 从左到右)进行评估,而之前未指定。

【讨论】:

    猜你喜欢
    • 2014-11-15
    • 2012-02-14
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多