Java中等式"i ++ + ++ i"的计算顺序是什么?

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)

Li3*_*357 8

一元邮政和预增量的优先级高于增加:

  1. b = 1,b初始化为1.
  2. b++,b等式中的当前值为1,然后b递增.
  3. ++b,b由于后增量而增加,所以它是2.现在它由于预增量而再次增加,并且它在等式中的值是3.
  4. 1 + 3 是4.

关键是,预增量递增变量,然后返回它因此++1,该值被递增,然后被返回,并且计算结果为2.后递增,则返回变量值,则递增.因此1++将评估为1,然后在后面的参考上增加到2.所以:

  1. b++ + ++b
    ^^^
    post-increment, evaluates to 1
    
  2. 1 + ++b
        ^^^
        pre-increment, due to post-increment is 2, then pre-increments and evaluates to 3
    
  3. 1 + 3
    ^^^^^
    evaluates to 4
    

这也适用于第一和第三个例子.因为a + ++a,++a有更高的优先权.首先,a评估,此时为1,然后++a评估它具有更高的优先级,其中a递增,然后值返回并计算为2.然后,评估加法,如下所示:

  1. a + ++a
    ^
    nothing, evaluates to 1
    
  2. 1 + ++a
        ^^^
        pre-increment, evaluates to 2
    
  3. 1 + 2
    ^^^^^
    evaluates to 3
    

在第三个示例中c++ + c,c是后递增的,因此它的计算结果为1,然后递增.最后一个c是2,看起来像这样:

  1. c++ + c
    ^^^
    post-increment, evaluates to 1
    
  2. 1 + c
        ^
        nothing, due to post-increment is 2 and evaluates to 2
    
  3. 1 + 2
    ^^^^^
    evaluates to 3
    

因此输出:

3
4
3
Run Code Online (Sandbox Code Playgroud)

应该注意的是,优先权并不决定评估顺序.优先级仅更改表达式的括号.Java中的评估顺序总是从左到右作为ajb注释,与C/C++不同,请参阅JLS 15.7.