C和Java中PreIncrement和PostIncrement运算符的行为

时间:2013-07-07 18:06:45

标签: java c post-increment pre-increment

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

Visual 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

为什么这两种语言的输出不同?语言对于前后增量运算符的处理方式有何不同?

2 个答案:

答案 0 :(得分:4)

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

我不确定Java是否也是如此。但对C ++来说肯定是这样。

这是一个很好的参考:
Undefined behavior and sequence points

答案 1 :(得分:2)

在C / C ++中,行为是未定义的,因为在此表达式中i被修改了一次而没有插入序列点。阅读:What's the value of i++ + i++?

当然,this kind of codes的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;