繁体   English   中英

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

[英]a += a++ * a++ * a++ in Java. How does it get evaluated?

在这个网站上遇到过这个问题,并在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),结果证明是真的。 我想我错过了关于这个运算符优先级的一些东西。

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( 参考 ):

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

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

  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

后缀运算符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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM