preincrement postincrement precedence issues

时间:2014-08-30 18:32:32

标签: java operators prefix operator-precedence

我在某处读到postfix运算符的优先级高于prefix运算符。

我试过这段代码:

int i=4;
System.out.println(--i+i++);  

我预计输出为7,因为我认为首先计算i ++,然后是-i

结果是6,因此编译器可能首先评估前缀。

Plz解释。

2 个答案:

答案 0 :(得分:2)

以下是发生的事情:

--i makes i = 3.

您正在进行3 + i++

因为我现在已经3岁了,而你已经在我之后有了3 + 3,那么此行i之后将成为4。 因此,您正在打印3+3,即6,然后将i更改为4(之后)。

无论哪种方式,...为什么你会做到这一点我不知道,阅读起来很可怕。

然而,对于学习,你应该尝试:

int i=4;
System.out.println(--i+i++);
System.out.println(i);  

它应该打印6,然后是4.这是因为当你有i ++时,你正在使用i,然后再添加1。当你使用--i时,你正在使用i,然后使用i。如果你想使用i然后取一个,请使用i--。此外,如果你想添加1然后使用i,请使用++ i。

答案 1 :(得分:1)

根据定义,在命令之前发生pre(in | de)创建。根据定义,在命令之后发生post(in | de)创建。所以你的命令相当于:

int i=4;
i -= 1;
System.out.println(i+i);
i += 1;

当括号可以改变事物的意义时,优先权就会发挥作用。自(2*3)+4 != 2*(3+4)起,我们需要优先评估2*3+4。同样,i+(++i) != (i++)+i(第一个是i+=1;i+i;第二个是i+i;i+=1;),因此我们需要使用括号或优先级来评估i+++i。但是括号无法改变--i+i++,因此不需要优先权。

但正如NutterzUK指出的那样,在实际代码中任何一个都是可怕的。