Java中变量的分配优先级

问题描述

我有一个代码片段示例

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

请任何人向我解释为什么在这种情况下i3将被初始化为5?我以为i2之后的(i2 = i1)将是2。而i2 + i2将是4

解决方法

您经常会犯以下错误:将运算符优先级与操作数的评估顺序相混淆。

优先级仅影响表达式的结构(即含义)。由于您使用了显式括号,因此i2 + (i2 = i1)中没有真正的疑问-不可能表示(i2 + i2) = i1

但是,在Java中,操作数的评估始终为left-to-right。所以“ i2 +(i2 = i1)”表示:

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

此序列仅是说明性的,并不是说这是编译器生成的实际目标代码。但这是如何理解您将获得什么结果的方法。

但是,实际上,您不希望编写将变量的赋值组合并使用该变量的先验值的代码。如果我要进行代码审查,建议您重新编写。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...