在Java中,为什么括号中的赋值不在表达式的其余部分求值之前发生?
考虑在Java中,为什么括号中的赋值不在表达式的其余部分求值之前发生?,java,operator-precedence,Java,Operator Precedence,考虑 int a = 20; a = a + (a = 5); // a == 25, why not 10? 括号不是胜过所有优先规则吗?在计算某些表达式之前,RHS上的某些变量是否已预填充?因为在您的示例中,首先加载a,然后计算括号中的位。如果您颠倒顺序: int a = 20; a = (a = 5) + a; System.out.println(a); f将在g之前调用。想象一下,如果是这样的话,它会多么不直观 f() + (g()) 在f之前调用g 所有这些都在中详细介绍(感谢
int a = 20;
a = a + (a = 5); // a == 25, why not 10?
括号不是胜过所有优先规则吗?在计算某些表达式之前,RHS上的某些变量是否已预填充?因为在您的示例中,首先加载
a
,然后计算括号中的位。如果您颠倒顺序:
int a = 20;
a = (a = 5) + a;
System.out.println(a);
f
将在g
之前调用。想象一下,如果是这样的话,它会多么不直观
f() + (g())
在f
之前调用g
所有这些都在中详细介绍(感谢@paisanco在评论中提到它)。来自
Java编程语言保证
运算符似乎按特定的求值顺序求值,
即从左到右
及
二元运算符的左操作数似乎完全相同
在计算右操作数的任何部分之前进行计算
将表达式括在括号中只会有助于分组(和关联性),它不会强制其求值发生在其左边的任何内容之前。生成的字节码:
BIPUSH 20
ISTORE 1
ILOAD 1
ICONST_5
DUP
ISTORE 1
IADD
ISTORE 1
RETURN
LOCALVARIABLE a I
首先,将20分配给第一个变量(a):
然后,将第一个变量的内容加载到堆栈(将20放入堆栈):
然后,将常量“5”推送到堆栈两次(205):
然后,将堆栈顶部存储到第一个变量(a):
a现在是5,堆栈现在是(205)。我们将两个操作数相加,并将其和放入第一个变量(a):
因此,a现在是20+5=25。我们结束:
RETURN
我认为括号
(…)
应该首先在表达式中求值。这是正确的答案,请参阅@paisanco的15.7.4。谢谢,我已经将其添加到了答案中。很好的答案和示例,ty@arshajii这对我来说不是直觉。这需要一些忘却。显然,我有一个青少年时期根深蒂固的“括号总是放在第一位”的观念P
BIPUSH 20
ISTORE 1
ILOAD 1
ICONST_5
DUP
ISTORE 1
IADD
ISTORE 1
RETURN
LOCALVARIABLE a I
BIPUSH 20
ISTORE 1
ILOAD 1
ICONST_5
DUP
ISTORE 1
IADD
ISTORE 1
RETURN