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

What is the operations order of these two functions

我在写一个函数来计算球体的体积时遇到问题,我不知道为什么如果我将 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
}

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

1 The multiplicative operators *, /, and % group left-to-right.

因此这个表达式

4/3 * PI 

被评价为

( 4/3 ) * PI 

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

这个表达式

PI * 4/3

也像

一样从左到右求值
( PI * 4 )/3

但在本例中使用了浮点运算。由于通常的算术转换,操作数 4 被转换为具有双精度类型的变量 PI 的类型。然后操作数 3 也被转换为 double 类型,因为它的左操作数(表达式)( PI * 4 ) 的类型为 double.

在这个表达式中

PI * (4/3)

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

要获得正确的结果,请强制将答案设为浮点数,如下所示:

return 4.0/3 * PI * pow(radius, 3);

此外,*/ 运算符具有相同的优先级,因此表达式将从左到右计算。所以在 4/3 周围加上括号是正确的,除了它进行整数除法。