c ++运算符评估顺序

时间:2013-07-30 03:33:23

标签: c++ evaluation binary-operators

为了找出表达式" i ++ + i ++ + i ++ + i ++"发生了什么,我写了一个测试程序如下。 test program source code

用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,但它没有。

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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

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