Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将一维数组处理为[(b=c)[索引]]。这是什么意思?_Java_Arrays - Fatal编程技术网

Java 将一维数组处理为[(b=c)[索引]]。这是什么意思?

Java 将一维数组处理为[(b=c)[索引]]。这是什么意思?,java,arrays,Java,Arrays,在测试中,我面临以下问题: int[] a = {3, 2, 1, 0}; int[] b = {12, 13, 14, 15}; System.out.println(b[(b=a)[3]]); // ? System.out.println(b[3]); // ? 输出: 12 0 谁能解释这个结果 b[ (b=a) [3] ] 结构是什么意思?只需从左到右计算该表达式: b[ (b=a) [3] ] 首先是访问数组b中的索引 正在访问的索引由[]

在测试中,我面临以下问题:

    int[] a = {3, 2, 1, 0};
    int[] b = {12, 13, 14, 15};

    System.out.println(b[(b=a)[3]]); // ?
    System.out.println(b[3]); // ?
输出:

12
0
谁能解释这个结果

b[ (b=a) [3] ]

结构是什么意思?

只需从左到右计算该表达式:

b[ (b=a) [3] ]
  • 首先是访问数组
    b
    中的索引
  • 正在访问的索引由
    []
    中的表达式决定:

    • [(b=a)[3]]
  • 计算内部表达式:

    • 首先为
      b
      reference分配
      a
      reference的值。因此,现在
      b
      指的是
      a
      所指的数组。该表达式实际上相当于:
      • b=a
        ,后跟
        [b[3]]
因此,原始表达式变为:

b[a[3]] // == b[0] // == 12

现在,在第一个表达式之后,由于
b
引用已更改为指向
a
数组,因此第二个表达式:
b[3]
与:
a[3]
相同,即
0
只需从左到右计算该表达式:

b[ (b=a) [3] ]
  • 首先是访问数组
    b
    中的索引
  • 正在访问的索引由
    []
    中的表达式决定:

    • [(b=a)[3]]
  • 计算内部表达式:

    • 首先为
      b
      reference分配
      a
      reference的值。因此,现在
      b
      指的是
      a
      所指的数组。该表达式实际上相当于:
      • b=a
        ,后跟
        [b[3]]
因此,原始表达式变为:

b[a[3]] // == b[0] // == 12
现在,在第一个表达式之后,由于
b
引用已更改为指向
a
数组,第二个表达式:
b[3]
与:
a[3]
相同,即
0
b[(b=a)[3]
表示:

  • 数组
    b
    在本赋值
    (b=a)
  • 在此之后,
    (b=a)[3]
    意味着返回
    b
    的第四个索引,该索引为零(即数组b具有相同的
    a={3,2,1,0}
  • b[(b=a)[3]
    表示
    b[0]
    ,即
    12
  • b[(b=a)[3]
    表示:

  • 数组
    b
    在本赋值
    (b=a)
  • 在此之后,
    (b=a)[3]
    意味着返回
    b
    的第四个索引,该索引为零(即数组b具有相同的
    a={3,2,1,0}
  • b[(b=a)[3]
    表示
    b[0]
    ,即
    12

  • 它以
    b[a[3]]
    a[3]
    的形式执行。看起来括号
    (b=a)
    优先将a的值分配给b。然后取这个数组的第四个值
    a[3]
    (本例中为0),并将其用作外部b[0]的索引-因此,在这一点上,看起来第一行的[0]会被打印出来(或值12)。这是一个可怕的测试问题。这意味着在现实世界的应用程序中编写这样的代码是可以接受的。这意味着“模糊代码”。但是
    b=a
    的赋值确实会对第二个print语句产生影响。该赋值正是第二条语句打印0而不是15的原因。它作为
    b[a[3]]
    a[3]
    执行。看起来括号
    (b=a)
    优先将a的值赋值给b。然后取这个数组的第四个值
    a[3]
    (本例中为0),并将其用作外部b[0]的索引-因此,在这一点上,看起来第一行的[0]会被打印出来(或值12)。这是一个可怕的测试问题。这意味着在现实世界的应用程序中编写这样的代码是可以接受的。这意味着“模糊代码”。但是
    b=a
    的赋值确实会对第二个print语句产生影响。该赋值是第二条语句打印0而不是15的原因。为什么在(b=a)之前使用b[…]。@gstackoverflow,因为
    (b=a)
    表达式在数组访问表达式中。@gstackoverflow语言规范规定表达式的各个部分从左到右进行逻辑计算。(这与C和C++不同)为什么B(…)在(B= A)之前取而代之?@ GSTACKOFFASE因为<代码>(B= A)< /C>表达式在数组访问表达式中。@ GSTACKFROM语言规范说明表达式的片段是从左到右逻辑地计算的。(这与C和C++不同)在第2步中,我认为你在步骤2中要说第四索引<代码> A[3 ] < /C>(而不是第三索引),我想你是说第四索引<代码> [3 ] < /C> >(而不是第三索引)