C ++在链式乘法中的作用是什么?
int a, b, c, d;
// set values
int m = a*b*c*d;
答案 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的版本不同。
答案 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乘法中是真的一样。当最不重要的位对您很重要时,这可能会导致一些意外。
据我了解,该标准允许进行优化,但我远远不是一位语言律师"所以我对标准的最佳猜测并不是值得信赖的声明(与我对编译器实际操作的经验相比)。