乘法的顺序

amp*_*awd 5 c++ operator-precedence operator-keyword

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

int a, b, c, d;
// set values
int m = a*b*c*d;
Run Code Online (Sandbox Code Playgroud)

Ale*_*exD 13

运算符*具有从左到右的关联性:

int m = ((a * b) * c) * d;
Run Code Online (Sandbox Code Playgroud)

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

0 * INT_MAX * INT_MAX // 0
INT_MAX * INT_MAX * 0 // overflow
Run Code Online (Sandbox Code Playgroud)

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

  • @EdHeal不,问题是关于`*`一般.这个例子碰巧使用`int`.即使使用`int`也很重要因为溢出:`0*INT_MAX*INT_MAX`.如果先执行`INT_MAX*INT_MAX`,它会溢出,导致未定义的行为; 但如果先做"0*INT_MAX",结果就是0. (11认同)