Java中复合赋值运算符的操作顺序

用户4903

最近,我在一次模拟考试中遇到了以下问题,但对于为什么给出的答案是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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java中复合赋值运算符的操作顺序

来自分类Dev

在clang和gcc中的Constexpr复合赋值运算符

来自分类Dev

C ++中具有self的复合赋值运算符

来自分类Dev

在C ++中重载复合赋值运算符

来自分类Dev

Julia中的逐元素复合赋值运算符

来自分类Dev

C ++中具有self的复合赋值运算符

来自分类Dev

重载复合赋值运算符

来自分类Dev

Java中的赋值运算符

来自分类Dev

混合赋值和复合赋值运算符-优先吗?

来自分类Dev

混合赋值和复合赋值运算符-优先吗?

来自分类Dev

Java赋值运算符

来自分类Dev

括号和赋值运算符顺序

来自分类Dev

使用复合赋值运算符解决转换警告

来自分类Dev

重载复合赋值运算符的规范方法是什么?

来自分类Dev

Javascript封装和复合赋值运算符

来自分类Dev

重载复合赋值运算符的规范方法是什么?

来自分类Dev

赋值运算符会消耗Java中的内存吗?

来自分类Dev

Javascript:比较运算符中操作数的顺序

来自分类Dev

枚举上的复合赋值运算符的运算符重载

来自分类Dev

枚举上的复合赋值运算符的运算符重载

来自分类Dev

Java增量和赋值运算符

来自分类Dev

Java 无效赋值运算符

来自分类Dev

与Java不同,Javascript中的赋值运算符是否意味着LHS上的所有操作都反映给RHS?

来自分类Dev

C中的赋值运算符重载

来自分类Dev

赋值运算符中的序列点

来自分类Dev

<= Verilog中的赋值运算符

来自分类Dev

R中的赋值运算符:“ <-”和“ <<-”

来自分类Dev

覆盖JS中的赋值运算符

来自分类Dev

赋值运算符中的内存泄漏