繁体   English   中英

乘法的顺序

[英]The order of multiplications

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

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

operator *具有从左到右的关联性:

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

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

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

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

是的,订单是从左到右。

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);

它没有任何特殊的“顺序”,如图所示,从左到右。

int m = a * b * c * d;

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

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

据我所知,该标准允许优化,但我远不是一个“语言律师”所以我对标准的最佳猜测不是一个值得信赖的声明(与我对编译器实际做的经验相比)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM