我在Java中计算这个数学表达式的时候把事情搞砸了?
我的代码是:我在Java中计算这个数学表达式的时候把事情搞砸了?,java,expression,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
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。我做错了什么
此外,是否有在线程序可以通过逐步分析解决上述问题?如果是,您能说出一些吗?表达式从左到右求值:
x += (y*++x)-(x/y) -(y++);
3*6 - 6/3 - 3 == 18 - 2 - 3 == 13
所以
关于最后一部分,使用了x
的原始值,因为这是对以下内容的定义:
- 首先,对左侧操作数求值以生成变量。如果此计算突然完成,则赋值表达式 出于同样的原因突然完成;右操作数不正确 已计算,但未发生赋值
- 否则,保存左侧操作数的值,然后计算右侧操作数的值。如果此评估完成 突然,则赋值表达式为 相同的原因,并且没有分配发生
- 否则,左侧变量的保存值和右侧操作数的值将用于执行二进制操作 由复合赋值运算符指示。如果这个操作 突然完成,然后赋值表达式突然完成 出于同样的原因,并且没有分配发生
- 否则,二进制运算的结果将转换为左侧变量的类型,并进行值集转换 (§5.1.13)至适当的标准值集(非 扩展指数值集),转换结果为 存储到变量中
像
x+=y*++x-x/y-y++
这样的表达式正是人们避免使用它们的原因。如果你也避开它们,你将是一个更好的开发人员。我们不必追踪你来惩罚你:-)@paxdiablo这是我的一个学生的家庭作业(您犯的错误是在表达式期间执行后增量,而该后增量应保留到表达式计算之后。为什么即使在表达式的其余部分使用了x=6的值,也要使用x=5的原始值?另外,++x,-x,++y和--y不应该在所有其他表达式之前计算吗?为什么我们不是在这里这样做吗?Ref:@SomenathSinha添加了JLS引用来解释您第一条评论的问题。@SomenathSinha关于第二条评论,JLS声明在计算右操作数的任何部分之前,似乎已对二元运算符的左操作数进行了完全计算。
因此,例如,*代码>运算符,y
在x++
之前计算,对于第二个-
运算符,(y*++x)-(x/y)
是在y++
之前进行评估的。感谢Eran先生的努力,我对优先级感到困惑,但@KevinEsche用例子澄清了我的疑问,如果我听起来粗鲁无礼,我道歉。我希望和平
x += 13 == 18 // since the original value of x is used here