【发布时间】:2018-09-05 12:04:58
【问题描述】:
我有一个好奇的问题(在阅读一段粗略的代码时自己问)。再来看看表达式:
double a = c*d*e*2/3*f;
其中 c、d、e、f 是 double 类型的初始化变量。标准是否保证它将被视为c*d*e*2(双重结果)然后除以3并乘以f(或一些类似的行为)。显然,2/3 被计算为 0 是不可取的。
标准的哪一段定义了这一点?
【问题讨论】:
-
@jww 缩小了问题范围,目的是标准中适用的实际条款
-
正如 YSC 之前指出的,数学术语在这里使用非常松散甚至不正确。交换性意味着重新排序操作数,而不是操作,例如
a*b与b*a。你的意思是关联性,例如(a*b)*c与a*(b*c)。乘法在数学上既是关联的又是交换的,但 FP 乘法不是关联的,因为中间结果可能存在不同的舍入。然而,除法既不是结合的,也不是交换的。a*b/c是除法是数学的特殊情况。与乘法相关。
标签: c++ operators language-lawyer type-promotion