我们知道类型会得到提升。例如,如果你写:
int i = 2;
double d = 4.0;
double result = i / d;
。 。 。然后int
将升级为double
,结果为0.5
。但是,如果促销和评估订单发生冲突,我无法找到任何相关信息(谷歌也难以置信)。例如:
int i = 2;
int j = 4;
double d = 1.0;
double result = d * i / j;
在此示例中,值取决于促销发生的时间。如果在分割之前i
被提升,则结果将为0.5
,但如果i / j
的结果被提升,则会发生整数除法,结果为0.0
。
结果定义明确吗?它在C ++和其他C语言中是否相同?
答案 0 :(得分:2)
结果是明确定义的结果吗?
是
在C ++和其他C派生语言中是否相同?
C++
- 是的。但“C-derived languages”的定义并不明确,所以很难回答。
评估顺序
d * i / j
是
(d * i) / j
因此,由于i
,首先double
被提升为d * i
。
然后,结果(double
)必须除以j
,因此j
会被提升为double
。所以有两个促销。
然而,
d + i / j
操作顺序不同。首先,使用整数算术完成i / j
除法,然后将结果提升为double
。因此,只有一次促销。
答案 1 :(得分:1)
我认为促销活动与营业顺序相同。当编译器看到行
时double result = d * i / j;
它将这条线分解为:
double result;
result = d * i;
result = result / j;
在将其转换为机器代码之前。