这两个函数的操作顺序是什么
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
周围加上括号是正确的,除了它进行整数除法。
我在写一个函数来计算球体的体积时遇到问题,我不知道为什么如果我将 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
周围加上括号是正确的,除了它进行整数除法。