Java中复合赋值运算符的运算顺序
我最近在模拟考试中遇到了以下内容,并且根据操作顺序给出了为什么给出的答案为25,25 ,以及我在规范中可能缺少的内容,其中提供了有关原因的详细信息。
public class Test { public static void main(String[] args) { int k = 1; int[] a = {1}; k += (k = 4) * (k + 2); a[0] += (a[0] = 4) * (a[0] + 2); System.out.println(k + " , " + a[0]); } }
只需查看上面的第6行,我将替换相应的值,并获得以下内容:
k = k + (k = 4) * (k + 2);
我首先评估括号,表示k首先被赋值为4,然后被加到数字2,得到总数为6.这就是我解释的方式:
k = k + 4 * 6;
现在,这是令人困惑的地方。 根据操作的顺序,我得到以下内容,这在前面的表达式中是正确的:
k = k + 24;
在我的思考中, k应该是4,因为这是新的任务,但答案实际上是25,而不是28.显然复合运算符有一些优先顺序,我不理解,或者我的替换原则不正确。
在这个答案中,我只考虑k
情况,它对于数组来说是一样的。
int k = 1; k += (k = 4) * (k + 2); // k += (k = 4) * (k + 2) // 1 += (k = 4) * (k + 2) // 1 += 4 * (k + 2) with k = 4 // 1 += 4 * 6 with k = 4 // k = 25
这里的技巧:
-
k +=
在进行计算之前捕获k
的值。+=
称为复合赋值运算符 。 引用JLS的相关部分:
保存左侧操作数的值,然后评估右侧操作数。
-
k = 4
返回指定的值,因此4。
- JSON,XML连接到Android的web api?
- 当操作符存储在字符串中时执行数学运算
- 错误Grandle Build C:\ Program Files \ Java \ jdk1.7.0_79 \ bin \ java.exe”以非零退出值1结束
- 时间 – 分钟操作
- 未找到Android- R.java文件
- java.lang.NullPointerException:尝试调用虚方法’java.lang.String com.google.firebase.auth.FirebaseUser.getUid()’
- 找不到ID 0x7f090005的视图
- 局部变量是多余的java
- 使用MultiThreading可以更快地读取文件