首页 > 解决方案 > java中变量的赋值优先级

问题描述

我有一个代码片段示例

int i1 = 2;
int i2 = 3;
int i3 = i2 + (i2 = i1); 

请谁能向我解释为什么i3在这种情况下会用 5 初始化?我以为i2之后(i2 = i1)会是 2。然后i2 + i2会是 4

标签: javaoperatorsoperator-precedence

解决方案


您犯了将运算符优先级与操作数评估顺序混淆的常见错误。

优先级仅影响表达式的结构(即含义)。由于您使用显式括号,因此毫无疑问i2 + (i2 = i1)- 它不可能意味着(i2 + i2) = i1.

然而,在 Java 中,操作数的计算总是从左到右。所以 `i2 + (i2 = i1)' 的意思是:

  1. 取 i2 的值,称之为 'tmp1'
  2. 取 i2 的地址,称之为 'tmp2'
  3. 取 i1 的值
  4. 将该值的副本存储在地址“tmp2”
  5. 将手头的值加到 'tmp1' 的值上
  6. 这是表达式的结果

这个序列只是说明性的,我并不是说这是编译器生成的实际目标代码。但它是如何理解你会得到什么结果。

但是,在实践中,您不希望编写将赋值组合到变量并使用变量的先前值的代码。如果我在做代码审查,我建议你重新制定。


推荐阅读