【问题标题】:Promotion Order in C-like Languages类 C 语言中的提升顺序
【发布时间】:2014-09-06 02:26:41
【问题描述】:

我们知道类型会得到提升。例如,如果你写:

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 派生语言中是否相同?

【问题讨论】:

  • “如果提升和评估顺序冲突”--您认为它们会如何冲突?

标签: c type-promotion


【解决方案1】:

发生的事情的结果是否明确?

是的。

在 C++ 和其他 C 派生语言中是否相同?

对于C++ - 是的。但是“C 派生语言” 没有那么明确,所以很难回答。

评价顺序

d * i / j

(d * i) / j

因此,由于d * i,首先i 被提升为double

然后,结果 (double) 必须除以 j,因此 j 被提升为 double。所以有两个促销活动

然而,对于

d + i / j

操作顺序不同。首先,i / j 除法是使用整数运算完成的,然后将结果提升为double。所以只有一次促销

【讨论】:

    【解决方案2】:

    我相信提升顺序与操作顺序相同。当编译器看到这一行时

    double result = d * i / j;
    

    它把这条线分成:

    double result;
    result = d * i;
    result = result / j;
    

    在将其转换为机器码之前。

    【讨论】:

      猜你喜欢
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      相关资源
      最近更新 更多