【发布时间】: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 开始,
<<也有保证。尝试使用 C++17 标准编译您的代码。另请参阅here。 -
@yeputons 是的,启用了 c++17,它按预期工作,非常感谢! x)