java运算符优先级y=--x+;x++;;

java运算符优先级y=--x+;x++;;,java,operator-precedence,post-increment,Java,Operator Precedence,Post Increment,根据链接,后缀增量(x++)的优先级高于前缀增量/减量(--x) 因此,x++(值10)应在--x(值11-1=10)之前执行;因此y=20。但是“y”怎么会变成18岁呢 如第页所述 关联性和优先级决定Java将运算符应用于子表达式的顺序,但它们不决定子表达式的求值顺序。在Java中,子表达式从左到右求值(如果有选择)。因此,例如在表达式A()+B()*C(D(),E())中,子表达式的求值顺序为A(),B(),D(),E(),和C()。虽然,C()同时出现在D()和E()的左边,但我们需要D(

根据链接,后缀增量(x++)的优先级高于前缀增量/减量(--x)

因此,
x++
(值10)应在
--x
(值11-1=10)之前执行;因此
y=20
。但是“y”怎么会变成18岁呢

如第页所述

关联性和优先级决定Java将运算符应用于子表达式的顺序,但它们不决定子表达式的求值顺序。在Java中,子表达式从左到右求值(如果有选择)。因此,例如在表达式
A()+B()*C(D(),E())
中,子表达式的求值顺序为
A()
B()
D()
E()
,和
C()
。虽然,
C()
同时出现在D()和E()的左边,但我们需要
D()
E()
的结果来计算
C()
。编写依赖于这种行为的代码被认为是拙劣的风格(不同的编程语言可能使用不同的规则)

这就解释了原因

x=10;
y = --x + x++;
System.out.println(y);
// prints 18    
在之前执行和评估

--x
因为它是两个子表达式的和,整个表达式从左到右求值。因此,第一个表达式比
x++
之前执行(是的,后修复
++
通常具有更高的优先级,但这里包含它的子表达式在第一个表达式之后计算)

因此,18是正确的,因为您将9和x相加两次,如下所述

x++
正如在

关联性和优先级决定Java将运算符应用于子表达式的顺序,但它们不决定子表达式的求值顺序。在Java中,子表达式从左到右求值(如果有选择)。因此,例如在表达式
A()+B()*C(D(),E())
中,子表达式的求值顺序为
A()
B()
D()
E()
,和
C()
。虽然,
C()
同时出现在D()和E()的左边,但我们需要
D()
E()
的结果来计算
C()
。编写依赖于这种行为的代码被认为是拙劣的风格(不同的编程语言可能使用不同的规则)

这就解释了原因

x=10;
y = --x + x++;
System.out.println(y);
// prints 18    
在之前执行和评估

--x
因为它是两个子表达式的和,整个表达式从左到右求值。因此,第一个表达式比
x++
之前执行(是的,后修复
++
通常具有更高的优先级,但这里包含它的子表达式在第一个表达式之后计算)

因此,18是正确的,因为您将9和x相加两次,如下所述

x++

我也不知道在那个教程中,更高优先级是什么意思;这当然与此无关。
+
的操作数从左到右求值,因此
--x
x++
之前求值@Tunaki的链接对于更多细节非常有用。我首先感兴趣的是,在
++a
之前有
a++
有什么意义,因为
+++a++
是不正确的,因为两个
++
都将返回值,但它们都期望变量,所以其中一个只会导致异常,不管它是否将被编译为
(++a)++
++(a++)
。但是如果我没有弄错的话,在
a+++b
的情况下,判断它是
(a+++b
,而不是
a+++b
,这很方便;这当然与此无关。
+
的操作数从左到右求值,因此
--x
x++
之前求值@Tunaki的链接对于更多细节非常有用。我首先感兴趣的是,在
++a
之前有
a++
有什么意义,因为
+++a++
是不正确的,因为两个
++
都将返回值,但它们都期望变量,所以其中一个只会导致异常,不管它是否将被编译为
(++a)++
++(a++)
。但是如果我没有弄错的话,在
a+++b
的情况下,它会很方便地确定它是
(a+++b
,而不是
a+++b
@Pshemo,我更新了我的answer@maanick90,我更新了我的answer@Pshemo,我更新了我的answer@maanick90,我更新了我的答案