【问题标题】:c++ operator evaluation order [duplicate]c ++运算符评估顺序[重复]
【发布时间】:2013-07-30 01:24:59
【问题描述】:

为了找出表达式“i++ + i++ + i++ + i++”发生了什么,我编写了一个如下的测试程序。

用g++ 4.6.3编译并在Ubuntu 12.04下运行这个程序,结果是:

构造 3 构造 7 构造 12 建造 18 构造无值 为 18 调用 i++ 为 12 调用 i++ 为 7 调用 i++ 为 3 调用 i++ 呼叫 + 为 3 和 7 拨打 + 10 和 12 拨打 + 获取 22 和 18 i1++ + i2++ + i3++ + i4++ : 4 8 13 19 40 构造 3 为 3 调用 i++ 为 4 调用 i++ 为 5 调用 i++ 为 6 调用 i++ 呼叫 + 6 和 5 拨打 + 11 和 4 拨打 + 15 和 3 i++ + i++ + i++ + i++ : 7 18 × 7 × 12

对比使用我定义的Int类型的测试用例一和二的结果,我预测测试用例三应该打印x 7 xx 18,但它没有。

我的问题是如何解释结果?

【问题讨论】:

  • 这是未定义的行为。不要在这里寻找任何逻辑不会有。
  • 请将代码发布为格式化文本,而不是图像,以便回答者可以将其复制到自己的环境中进行使用。

标签: c++ evaluation binary-operators


【解决方案1】:

i++ + i++ 形式的表达式将具有与编译器相关的结果。评估顺序没有被标准很好地定义,因此,我们称之为未定义行为。

【讨论】:

    【解决方案2】:

    序列点定义了计算机程序执行中的任何点,在该点可以保证先前评估的所有副作用都已执行,并且后续评估的副作用尚未执行。它们经常在参考 C 和 C++ 时被提及,因为某些表达式的结果可能取决于其子表达式的求值顺序。

    这里有两个序列点在 i++(第一个)和 i++(第二个)。标准说:

    " 在前一个和下一个序列点之间,一个标量对象的存储值最多只能通过表达式的计算修改一次。"

    因此,如果您尝试在两个序列点之间修改变量的值,那么它将给出未定义的行为。

    序列点的维基链接 http://en.wikipedia.org/wiki/Sequence_point

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-01-17
      相关资源
      最近更新 更多