【问题标题】:Operator precedence, which result is correct? [duplicate]运算符优先级,哪个结果是正确的? [复制]
【发布时间】:2011-07-31 01:57:42
【问题描述】:

可能重复:
Undefined behavior and sequence points

这段代码后面x的值是多少?

int x = 5;
x = ++x + x++;

在 Java 中,结果是 12,但在 C++ 中,结果是 13。

我搜索了 Java 和 C++ 的运算符优先级,它们看起来一样。那么为什么结果不一样呢?是编译器的原因吗?

【问题讨论】:

标签: java c++ operator-precedence


【解决方案1】:

这是C++ 中未定义的行为。参见标准中的 5.4。

【讨论】:

  • 不,它是未定义的。未指定行为是指实现必须做一些有用的事情,但可以任意决定实际行为(比如决定是在(f(x) + g(x)) 中计算f(x) 还是g(x))。
【解决方案2】:

运算符优先级控制如何将操作数组合在一起以计算结果。它不一定控制应用副作用的顺序。

在 C++ 中,++ 运算符都将在 + 运算符之前计算(尽管这仅在 ++x 中有所不同,因为 x++ 的值与 x 相同)。递增x 的副作用发生在 C++ 中的下一个序列点之前,这就是我们所能说的,并且该表达式中唯一的序列点是在它被完全评估之后,包括赋值。此外,根据标准,在序列点之间多次修改对象的结果是明确未定义的。

给定未定义的行为,典型的实现会做一些取决于实现序列如何定义行为的细节,因此如果你坚持使用一个编译器的一个版本,你通常会得到一致的结果。

【讨论】:

    【解决方案3】:

    在 Java 中,它被定义为 12。它的计算结果如下:

    x = ++x + x++;
    x = 6 + x++; // x is now 6
    x = 6 + 6; // x is now 7
    x = 12 // x is now 12
    

    由于Evaluate Left-Hand Operand First+ (++x) 的左操作数在右操作数之前被完全计算。另请参阅 previous answerthis one,关于类似主题,并提供标准链接。

    在 C++ 中,这是未定义的行为,因为您要修改 x 三次而没有干预 sequence point

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 2012-02-01
      • 2011-07-07
      相关资源
      最近更新 更多