Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.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_Operator Precedence - Fatal编程技术网

在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