Według specyfikacji:
15.26 operatora przypisania jest 12 operatorzy przeniesienia; wszystkie są syntaktycznie prawostronne (grupują się od prawej do lewej). Zatem a = b = c oznacza a = (b = c), który przypisuje wartość c do b, a następnie przypisuje wartość b do a.
Więc a[i] = i = 9;
jest taka sama jak i = 9; a[i] = i;
Edytuj
Właściwie, to nie jest przypadek. Przykładowa klasa Test: run
import java.util.Arrays;
public class Mkt {
public static void main(String[] args) {
int[] a = new int[10];
int i = 5;
a[i] = i = 9;
System.out.println(Arrays.toString(a));
}
}
Próbka:
$ javac Mkt.java && java Mkt
[0, 0, 0, 0, 0, 9, 0, 0, 0, 0]
Proszę odnieść się do the other answer aby uzyskać więcej informacji. Zasadniczo:
a[i] = i = 9
jest taka sama jak a[i] = (i = 9)
, jak =
jest tuż-asocjacyjne
Jednak operand ocena jest od lewej do prawej, jak na this:
15.7.Zamówienie oceny
Język programowania Java gwarantuje, że operandy operatorów wydają się być oceniane w określonej kolejności oceny, a mianowicie od lewej do prawej.
Zaleca się, aby kod ten nie opierał się w głównej mierze na tej specyfikacji. Kod jest zwykle bardziej przejrzysty, gdy każde wyrażenie zawiera co najwyżej jeden efekt uboczny, jako jego najbardziej zewnętrzną operację, a kod nie zależy dokładnie od tego, który wyjątek powstaje w wyniku oceny wyrażeń od lewej do prawej.
Skopiowałem akapit drugi, który jest tutaj bardzo pouczający - rzadko ma sens pisanie tego mylącego kodu.
Również znajduję this warto sprawdzić.
Dziękuję Tom, to ma sens. – HSeldon