cai*_*sil 1 java increment operators operator-precedence
考虑一下片段:
int a = 1, b = 1, c = 1;
System.out.println(a + ++a);
System.out.println(b++ + ++b);
System.out.println(c++ + c);
Run Code Online (Sandbox Code Playgroud)
输出是:
3
4
3
Run Code Online (Sandbox Code Playgroud)
这是我认为正在发生的事情,但输出不匹配:
1. ++a -> +a -> 4 = 2 + 2
2. ++b -> +b -> 4 = 2 + 2
3. c -> +c -> 2 = 1 + 1
Run Code Online (Sandbox Code Playgroud)
一元邮政和预增量的优先级高于增加:
b = 1,b初始化为1.b++,b等式中的当前值为1,然后b递增.++b,b由于后增量而增加,所以它是2.现在它由于预增量而再次增加,并且它在等式中的值是3.1 + 3 是4.关键是,预增量递增变量,然后返回它因此++1,该值被递增,然后被返回,并且计算结果为2.后递增,则返回变量值,则递增.因此1++将评估为1,然后在后面的参考上增加到2.所以:
b++ + ++b ^^^ post-increment, evaluates to 1
1 + ++b
^^^
pre-increment, due to post-increment is 2, then pre-increments and evaluates to 3
1 + 3 ^^^^^ evaluates to 4
这也适用于第一和第三个例子.因为a + ++a,++a有更高的优先权.首先,a评估,此时为1,然后++a评估它具有更高的优先级,其中a递增,然后值返回并计算为2.然后,评估加法,如下所示:
a + ++a ^ nothing, evaluates to 1
1 + ++a
^^^
pre-increment, evaluates to 2
1 + 2 ^^^^^ evaluates to 3
在第三个示例中c++ + c,c是后递增的,因此它的计算结果为1,然后递增.最后一个c是2,看起来像这样:
c++ + c ^^^ post-increment, evaluates to 1
1 + c
^
nothing, due to post-increment is 2 and evaluates to 2
1 + 2 ^^^^^ evaluates to 3
因此输出:
3
4
3
Run Code Online (Sandbox Code Playgroud)
应该注意的是,优先权并不决定评估顺序.优先级仅更改表达式的括号.Java中的评估顺序总是从左到右作为ajb注释,与C/C++不同,请参阅JLS 15.7.