9

我在这个网站上遇到了这个问题,并在 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

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

4

6 回答 6

13

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

后缀增量运算符仅在使用/返回变量后递增变量。一切似乎都是正确的。

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

int x = 5;
int temp = x;
x += 1;
return temp;

从 JLS 15.14.2(参考):

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

于 2012-11-13T21:53:00.487 回答
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
于 2012-11-13T21:56:24.377 回答
2

后缀运算符的x++意思是“现在给我 x 的值,但增加它以供将来参考”

因此,按照操作和评估的顺序

x++ * x++ * x++

首先被解释为

3 * 4 * 5(=60)

然后将其添加到原始3 中,得到 63。

使用原始值是因为它在同一行上,您是否写过类似的内容:

int x = 3;

int y += x++ * x++ * x++; 
x += y;

x现在是 66,而不是 63,因为x第二行中的现在是 6,而不是原来的 3。

于 2012-11-13T21:54:00.490 回答
2

因为在变量 x 后面加上了自增运算++。这是一个后增量操作。这意味着,x 在处理操作后递增。

In your example the expression would be: 
x += 3 * 4 * 5
First the expression is added by 3 (x+=....)
then the first x++ results in 3
the second x++ results in 4 (because it was incremented before)
and the third x++ results in 5.

如果你想让你的变量在操作执行之前递增,你必须写 ++x (预递增操作)

于 2012-11-13T22:11:26.887 回答
1

因为后增量会在取值后修改变量,并且 += 在评估其右侧之前评估其左侧,

x += x++ * x++ * x++; 

变成

tmp0 = x

tmp1 = x
++x
tmp2 = tmp1 * x
++x
tmp3 = tmp2 * x
++x

x = tmp0 + x
于 2012-11-13T21:53:08.887 回答
1

一元运算符从左到右求值,所以第一个x++得到 value x,第二个是(x+1),依此类推。 += 根据x开头的 value 求值,因此加上x

于 2012-11-13T21:54:55.720 回答