Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我在Java中计算这个数学表达式的时候把事情搞砸了?_Java_Expression - Fatal编程技术网

我在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