6

我在 Visual C++ 和 Java 中运行以下程序:

视觉 C++

void main()
{
    int i = 1, j;
    j = i++ + i++ + ++i;
    printf("%d\n",j);
}

输出:

6

爪哇:

public class Increment {
    public static void main(String[] args) {
        int i = 1, j;
        j = i++ + i++ + ++i;
        System.out.println(j);
    }
}

输出:

7

为什么这两种语言的输出不同?两种语言如何以不同的方式处理前置和后置运算符?

4

2 回答 2

4

C++ 示例唤起了未定义的行为。您不能在一个表达式中多次修改一个值。序列点之间。[编辑得更准确。]

我不确定Java是否也是如此。但对于 C++ 来说确实如此。

这是一个很好的参考:
未定义的行为和序列点

于 2013-07-07T18:10:36.030 回答
2

在 C/C++ 中,行为是未定义的,因为在此表达式i中被修改了不止一次,而没有中间的序列点。阅读:i++ + i++的价值是什么?

当然,这种代码在 Java 中的行为是明确定义的。以下是我对 Java 的逐步回答:

一开始i1.

j = i++ + i++ + ++i;
// first step, post increment
j = i++ + i++ + ++i;
//  ^^^
j = 1   + i++ + ++i;
// now, i is 2, and another post increment:
j = i++ + i++ + ++i;
//  ^^^^^^^^^
j = 1   + 2   + ++i;
// now, i is 3 and we have a pre increment:
j = i++ + i++ + ++i;
//  ^^^^^^^^^^^^^^^^
j = 1   + 2   +   4;
j = 7;
于 2013-07-07T18:18:51.840 回答