我在哪里搞砸了Java中这个数学表达式的评估?

时间:2016-09-22 11:43:53

标签: java expression

我的代码是:

int x=5,y=3;
x+=y*++x-x/y-y++;
System.out.println("Value = "+x);

我的评价如下:

  

X + = Y * ++ X-X / Y-Y ++
  (x = 5 | y = 3)

     

X = X +(Y * ++ X-X / Y-Y ++)
  (x = 5 | y = 3)| ++和 - 具有最高优先级

     

X = X +(Y * 6-X / Y-3)
  (x = 6 | y = 4)| *和/具有次优先级

     

X = X +(4 * 6-(6/4)-3)
  (x = 6 | y = 4)

     

x = x +(24 -1 -3)
  (x = 6 | y = 4)

     

x = 6 + 20
  (x = 6 | y = 4)

     

x = 26。

但是,当我在Java中评估上述内容时,输出结果为18.我做错了什么?

此外,是否有任何在线程序可以通过逐步分析解决上述问题?如果是这样,你能说出一些吗?

1 个答案:

答案 0 :(得分:6)

表达式从左到右进行评估:

x += (y*++x)-(x/y) -(y++);
      3*6   - 6/3  - 3     == 18 - 2 - 3 == 13

所以

x += 13 == 18 // since the original value of x is used here

关于最后一部分,使用x的原始值,因为这是compound assignment operators的定义:

  
      
  • 首先,评估左侧操作数以生成变量。如果此评估突然完成,则为赋值表达式   因同样的原因突然完成;右手操作数不是   评估并且没有分配。

  •   
  • 否则,保存左侧操作数的值,然后评估右侧操作数。如果此评估完成   然后突然完成赋值表达式   同样的原因,没有任何转让。

  •   
  • 否则,左侧变量的保存值和右侧操作数的值用于执行二进制操作   由复合赋值运算符表示。如果这个操作   突然完成,然后赋值表达式突然完成   出于同样的原因,没有任何转让。

  •   
  • 否则,二进制运算的结果转换为左侧变量的类型,进行值集转换   (§5.1.13)到适当的标准值集(不是   扩展指数值集),转换结果是   存储在变量中。

  •