Java中的a + = a ++*a ++*a ++.如何评估?

Ash*_*ath 8 java operator-precedence post-increment

在这个网站上遇到过这个问题,并在Eclipse中尝试过,但无法理解它们的评估方式.

    int x = 3, y = 7, z = 4;

    x += x++ * x++ * x++;  // gives x = 63
    System.out.println(x);

    y = y * y++;
    System.out.println(y); // gives y = 49

    z = z++ + z;
    System.out.println(z);  // gives z = 9
Run Code Online (Sandbox Code Playgroud)

根据网站上的评论,x + = x ++*x ++*x ++解析为x = x +((x + 2)*(x + 1)*x),结果证明是真的.我想我错过了关于这个运算符优先级的一些东西.

jn1*_*1kk 12

Java根据其优先级从左到右评估表达式.

int x = 3, y = 7, z = 4;

x (3) += x++ (3) * x++ (4) * x++ (5);  // gives x = 63
System.out.println(x);

y = y (7) * y++ (7);
System.out.println(y); // gives y = 49

z = z++ (4) + z (5);
System.out.println(z);  // gives z = 9
Run Code Online (Sandbox Code Playgroud)

Postfix增量运算符仅在使用/返回变量后递增变量.一切似乎都正确.

这是后缀增量运算符的伪代码:

int x = 5;
int temp = x;
x += 1;
return temp;
Run Code Online (Sandbox Code Playgroud)

从JLS 15.14.2(参考):

后缀增量表达式的值是存储新值之前的变量值.


Tim*_*der 5

与运算符优先级本身无关,只与评估顺序有关.这里要了解两件事:

  1. x++是后缀增量,因此值评估x递增
  2. * 评估右侧然后左侧.

考虑到第2点,表达式x++ * x++ * x++可以更具体地重写为x++ * (x++ * (x++)).

整个表达式可以写成程序:

a = x
x += 1
b = x
x += 1
c = a*b
d = x
x += 1
return c*d
Run Code Online (Sandbox Code Playgroud)