为了找出表达式" i ++ + i ++ + i ++ + i ++"发生了什么,我写了一个测试程序如下。
用g ++ 4.6.3编译并在Ubuntu 12.04下运行该程序,结果是:
construct 3 construct 7 construct 12 construct 18 construct novalue call i++ for 18 call i++ for 12 call i++ for 7 call i++ for 3 call + for 3 and 7 call + for 10 and 12 call + for 22 and 18 i1++ + i2++ + i3++ + i4++ : 4 8 13 19 40 construct 3 call i++ for 3 call i++ for 4 call i++ for 5 call i++ for 6 call + for 6 and 5 call + for 11 and 4 call + for 15 and 3 i++ + i++ + i++ + i++ : 7 18 x 7 xx 12
使用我定义的Int
类型的测试用例1和2的结果的对比,我预测测试用例3应该打印x 7 xx 18
,但它没有。
我的问题是如何解释结果?
答案 0 :(得分:2)
序列点定义计算机程序执行中的任何点,在该点保证先前评估的所有副作用都已执行,并且尚未执行后续评估的副作用。它们经常在引用C和C ++时被提及,因为某些表达式的结果可能取决于它们的子表达式的评估顺序。
这里有i ++(第一个)和i ++(第二个)的两个序列点。标准说:
“在上一个和下一个序列点之间,标量对象的表达式评估最多只能修改一次存储值。”
因此,如果您尝试修改两个序列点之间的变量值,那么它将给出未定义的行为。
序列点的Wiki链接 http://en.wikipedia.org/wiki/Sequence_point
答案 1 :(得分:0)
i++ + i++
形式的表达式将具有依赖于编译器的结果。标准没有很好地定义评估顺序,因此,我们称之为未定义的行为。