Java-массивы - почему вывод «1»? - PullRequest
24 голосов
/ 04 декабря 2011

Почему выходные данные в этом примере 1 ?

public static void main(String[] args){
 int[] a = { 1, 2, 3, 4 };   
 int[] b = { 2, 3, 1, 0 };   
 System.out.println( a [ (a = b)[3] ] );   
}

Я думал, что это будет 2 .то есть выражение оценивается как:

a[(a=b)[3]]
a[b[3]]    //because a is now pointing to b
a[0]   

Не должно ли [0] быть 2 , поскольку a указывает на b ?

Заранее спасибо.

Ответы [ 4 ]

26 голосов
/ 04 декабря 2011

Аргументы для каждого оператора оцениваются слева направо. То есть, a перед [...] оценивается перед его содержимым, и в этот момент он все еще ссылается на первый массив.

16 голосов
/ 04 декабря 2011

Это также меня утомило ... однако, проверьте раздел 15.7.1 над здесь

По существу, операнды оцениваются слева направо.Но также обратите внимание на следующее:

Рекомендуется, чтобы код не зависел от этой спецификации.Код обычно более понятен, когда каждое выражение содержит не более одного побочного эффекта в качестве самой внешней операции, и когда код не зависит от того, какое именно исключение возникает в результате вычисления выражений слева направо.

7 голосов
/ 04 декабря 2011
a [ (a = b)[3] ] )

интерпретируется следующим образом:

a = b => a = {2, 3, 1, 0};
( a = b )[3] => 0;

Вот здесь уловка: a оценивается как значение до присвоения ему b.

a[(a = b)[3]) => a[0] = 1;

Подумайте о приоритете операторов в Java.Это должно быть немного более очевидно.

2 голосов
/ 20 августа 2014

Как отметил г-н Марсело Кантос, аргументы каждого оператора оцениваются слева направо.Поэтому вот то, что я думаю, это выполнение

a[(a=b)[3]]

Здесь внешний 'a' будет извлекать "1,2,3,4", а затем оценивается его аргумент (a = b) [3].Таким образом, теперь a = b и возвращается элемент с индексом 3 в массиве b, на который также указывает a.

Следовательно, мы получаем '0' из оценки аргумента.Как было сказано ранее, external a все еще ссылается на старое содержимое. Таким образом, мы получаем [0] в массиве 1,2,3,4.

Поэтому мы получаем '1'.

Это мойпонимание.Пожалуйста, дайте мне знать, если это не так.

Спасибо,

...