问题描述
我有一个代码片段示例
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)”表示:
- 取i2的值,将其称为“ tmp1”
- 取i2的地址,称为“ tmp2”
- 取i1的值
- 将该值的副本存储在地址“ tmp2”
- 将手中的值添加到“ tmp1”的值中
- 这是表达式的结果
此序列仅是说明性的,并不是说这是编译器生成的实际目标代码。但这是如何理解您将获得什么结果的方法。
但是,实际上,您不希望编写将变量的赋值组合并使用该变量的先验值的代码。如果我要进行代码审查,建议您重新编写。