2012-02-25 11 views
11

Jaka jest kolejność operacji podczas korzystania z dwóch operatorów przypisania w jednym wierszu?Java - kolejność operacji - korzystanie z dwóch operatorów przypisania w jednej linii

public static void main(String[] args){ 
    int i = 0; 
    int[] a = {3, 6}; 
    a[i] = i = 9; // this line in particular 
    System.out.println(i + " " + a[0] + " " + a[1]); 
} 

Edit: Dzięki za słupkami. Rozumiem to = przyjmuje wartości z prawej strony, ale kiedy mogę skompilować to uzyskać:

9 9 6 

myślałem byłoby i ArrayOutOfBounds wyjątek, ale to jest przypisanie „a [i]” przed to rusza w stosunku do 9. Czy robi to po prostu dla tablic?

Odpowiedz

10

= jest analizowany jako stowarzyszenie prawostronne, ale kolejność oceny jest od lewej do prawej.

Tak: Instrukcja jest przetwarzana jako a[i] = (i = 9). Jednak wyrażenie i w a[i] jest oceniane przed prawą stroną (i = 9), gdy i nadal jest 0.

Jest to równoznaczne z czymś takim:

int[] #0 = a; 
int #1 = i; 
int #2 = 9; 
i = #2; 
#0[#1] = #2; 
+0

Dziękuję Tom, to ma sens. – HSeldon

2

Jeśli dobrze pamiętam, = operator jest prawostronny; więc zostanie mi przydzielony pierwszy, a następnie [i].

0

Operator = ma skojarzenia prawe (jak już powiedzieli inni). Można to łatwo sprawdzić za pomocą tego testu:

int i = 2; 
int j = 3; 
int x = i = j; 
System.out.println(x); // This prints out 3. 

Działa to ze wszystkimi typami, obiektami i prymitywami.

Sposób Słyszałem to mowa jest „podwójny przydział”, ponieważ, korzystając z przykładu powyżej, jesteś przypisując wartość j zarówno i i x.

6

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ć.

Powiązane problemy