左移运算符应用于数组元素,但未修改数组

The left-shift operator is applied to an array element, but the array is not modified

package sample;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {

        A a = new A();
        System.out.println(Arrays.toString(a.array));
        a.leftShiftArrayElem();
        System.out.println(Arrays.toString(a.array));
        System.out.println(a.t);
        a.leftShiftField();
        System.out.println(a.t);

    }

    static class A {

        byte[] array = new byte[] {
                1, 2, 3
        };
        int t = 4;

        int leftShiftArrayElem() {
            int len = array[0] << 2;
            return len;
        }

        int leftShiftField() {
            int p = t << 2;
            return p;
        }
    }
}

我确定:

  1. int len = array[0] << 2; 表示 "modify array[0] and assign the new value tolen`",
  2. int p = t << 2; 表示 "modify t and assign the new value to p."

我得到的输出:

[1, 2, 3]
[1, 2, 3]
4
4

我期望的输出:

[1, 2, 3]
[4, 2, 3]
4
16

Java 中的赋值并不是这样的。当你写

array[0] << 2,您没有将此值显式分配回 array[0]。您实际上是在使用 array[0].

值的副本

因此,没有任何修改。你可以试试int len = array[0] = array[0] << 2

您执行的更改很好但忘记分配输出值,更改:

a.leftShiftField();

至:

a.t = a.leftShiftField();

第一项也是如此,为了进行转换,您必须将其分配回数组,更改:

int len = array[0] << 2;

至:

array[0] = array[0] << 2;

(如果你想 return 你可以 return array[0] 的值)

表达式 array[0] 是一个 array access expression。在运行时它

refers to a variable that is a component of an array.

在表达式中

int len = array[0] << 2;

array[0] 求得数组中元素的值。然后,您应用 << 使用该值和值 2 作为其操作数。与数组或其元素无关。