乘法的顺序

时间:2015-07-25 20:45:48

标签: c++ operator-keyword operator-precedence

C ++在链式乘法中的作用是什么?

int a, b, c, d;
// set values
int m = a*b*c*d;

5 个答案:

答案 0 :(得分:12)

运营商*具有left to right关联性:

int m = ((a * b) * c) * d;

虽然在数学中它并不重要(乘法是associative),但在C和C ++的情况下,我们可能有或没有溢出,具体取决于顺序。

0 * INT_MAX * INT_MAX // 0
INT_MAX * INT_MAX * 0 // overflow

如果我们考虑浮点类型或运算符重载,事情会变得更加复杂。请参阅 @delnan @melpomene 的评论。

答案 1 :(得分:2)

没有任何特殊的"订单"它如图所示,从左到右相乘。

int m = a * b * c * d;

当使用加/减来进行除法/乘法时,操作顺序生效。否则它总是从左到右。无论如何,通过这个例子,无论他们处于何种顺序,解决方案都是一样的。

答案 2 :(得分:2)

是的,订单是从左到右。

int m = a * b * c * d;

如果您对评估顺序或运算符优先级主题更感兴趣,那么您可能会对某些++操作的行为感到惊讶,甚至与C的版本不同。

http://en.cppreference.com/w/c/language/eval_order

http://en.cppreference.com/w/c/language/operator_precedence

答案 3 :(得分:2)

在这种情况下,订单是从左到右

int m=a*b*c*d;

这里,首先计算(a * b),然后将结果乘以c,然后用括号表示d:

int m=(((a*b)*c)*d);

答案 4 :(得分:1)

订单名义上是从左到右。但是我使用的C ++编译器中的优化器可以随意更改他们认为理解的数据类型的顺序。如果你重载operator *并且优化器无法看到你的过载,那么它就无法改变顺序。但是当你将类型为double的一系列事物(变量,常量,函数结果等)相乘时,优化器可能会使用实数乘法的关联和可交换属性,就好像它在float或double乘法中是真的一样。当最不重要的位对您很重要时,这可能会导致一些意外。

据我了解,该标准允许进行优化,但我远远不是一位语言律师"所以我对标准的最佳猜测并不是值得信赖的声明(与我对编译器实际操作的经验相比)。