这两个函数的操作顺序是什么

Cri*_*dru 4 c++ floating-point integer integer-arithmetic

当我遇到问题时,我正在编写一个函数来计算球体的体积,但我不知道为什么如果将 4/3 * PI 更改为 PI * 4/3 我得到了不同的结果。评估的顺序是什么,如果我使用 (4/3) * PI 和 PI * (4/3) 这样的括号,我在这两种情况下都得到了错误的答案。

#define PI 3.141592

float Volume(int radius){
      return (4/3 * PI * pow(radius, 3));
}

float Volume(int radius){
      return (PI * 4/3 * pow(radius, 3)); //the good one
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 6

根据 C++ 标准(5.6 乘法运算符)

1 乘法运算符 *、/ 和 % 从左到右分组。

因此这个表达式

4/3 * PI 
Run Code Online (Sandbox Code Playgroud)

被评估为

( 4/3 ) * PI 
Run Code Online (Sandbox Code Playgroud)

所以在这个子表达式4 / 3中使用了整数算术,结果等于1

这个表情

PI * 4/3
Run Code Online (Sandbox Code Playgroud)

也是从左到右评估的

( PI * 4 )/3
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,使用了浮点算法。由于通常的算术转换,操作数4被转换为PI具有 double类型的变量的类型。然后操作数3也被转换为 double 类型,因为它的左操作数(表达式)( PI * 4 )具有 double 类型。

在这个表达式中

PI * (4/3)
Run Code Online (Sandbox Code Playgroud)

括号内再次使用整数运算,子表达式的结果是1