乘法的顺序

The order of multiplications

C++ 在链式乘法中的顺序是什么?

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

运算符 * 具有 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 的评论。

没有任何特殊的"order"它从左到右相乘。

int m = a * b * c * d;

当使用加法/减法和除法/乘法时,运算顺序会受到影响。否则它总是从左到右。无论如何,对于示例,无论它们处于哪种顺序,解决方案都是相同的。

是的,顺序是从左到右。

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

本例中顺序是从左到右 其中

int m=a*b*c*d;

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

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

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

据我所知,该标准允许进行优化,但我离 "language lawyer" 还很远,所以我对标准的最佳猜测是不可信的声明(与我在什么方面的经验相比)编译器实际上是这样做的)。