我的代码是:
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.我做错了什么?
此外,是否有任何在线程序可以通过逐步分析解决上述问题?如果是这样,你能说出一些吗?
答案 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)到适当的标准值集(不是 扩展指数值集),转换结果是 存储在变量中。