Java中的a + = a ++ * a ++ * a ++。 如何评估?
我在这个网站上遇到过这个问题,并在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),结果certificate是真的。 我想我错过了关于这个运算符优先级的一些东西。
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
Postfix增量运算符仅在使用/返回变量后递增变量。 一切似乎都正确。
这是后缀增量运算符的伪代码:
int x = 5; int temp = x; x += 1; return temp;
从JLS 15.14.2( 参考 ):
后缀增量表达式的值是存储新值之前的变量值。
与运算符优先级本身无关,只与评估顺序有关。 这里要了解两件事:
-
x++
是后缀增量,因此x
的值在计算后递增 -
*
评估右侧然后评估左侧。
考虑到第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
后缀运算符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。
因为在变量x之后添加了增量Operation ++。 这是一个后增量操作。 这意味着,在处理操作之后,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(预增量操作)
因为postincrement在获取值后修改变量,并且+ =在评估其右侧之前评估其左侧,
x += x++ * x++ * x++;
变
tmp0 = x tmp1 = x ++x tmp2 = tmp1 * x ++x tmp3 = tmp2 * x ++x x = tmp0 + x
一元运算符从左到右进行求值,所以第一个x++
得到值x
,第二个得到(x+1)
等等。+ =根据开始时x
的值计算,因此加x