我在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
为什么这两种语言的输出不同?语言对于前后增量运算符的处理方式有何不同?
答案 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的回答:
开头i
是1
。
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;