-2

为了找出表达式“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,但它没有。

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

4

2 回答 2

2

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

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

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

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

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

于 2013-07-30T03:54:17.240 回答
0

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

于 2013-07-30T03:36:00.123 回答