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]]
- 计算内部表达式:
- 首先为
reference分配b
reference的值。因此,现在a
指的是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]]
- 计算内部表达式:
- 首先为
reference分配b
reference的值。因此,现在a
指的是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> >(而不是第三索引)