2010-03-14 14 views
5

Könnte jemand bitte sagen Sie mir die Bedeutung von „++“ mit Array in dem folgenden Code in Java:Warum kann die linke Seite einer Zuweisung kein Inkrementausdruck sein?

int [ ] arr = new int[ 4 ]; 
    for(int i = 0; i < arr.length; i++){ 
     arr[ i ] = i + 1; 
     System.out.println(arr[ i ]++); 
    } 

was arr[ i ]++ Bedeutung im obigen Code ist, und warum können wir nicht tun:

arr[ i ]++ = i + 1; 
+1

Niemals einen solchen Codierungsstil (mit Leerzeichen in eckigen Klammern) in Java-Code gesehen. – Roman

+0

Als eine Randnotiz, der Bytecode für den Operator ++ hängt davon ab, ob es für eine lokale int-Variable verwendet wird oder nicht, und ob das Ergebnis verwendet wird oder nicht. Der einfachste Fall ist das bloße Inkrement einer lokalen int-Variablen, wobei eine einzelne Inkrement-Instruktion erzeugt wird. Wenn Sie ein Array-Member nachträglich inkrementieren, werden einige der komplexesten Bytecodes generiert.(Ich kann keine JIT-Transformation kommentieren.) – Neil

Antwort

7

Der Operator, der hier besprochen wird, wird als Postfix-Inkrementoperator (JLS 15.14.2) bezeichnet. Es wird angegeben, verhalten sich wie folgt:

  1. Zur Laufzeit, wenn die Auswertung des Operanden Ausdruck abrupt beendet ist, dann wird der Postfix Inkrementausdruck beendet abrupt aus dem gleichen Grund und keine Inkrementierung stattfindet.
  2. Andernfalls wird dem Wert der Variablen der Wert 1 hinzugefügt und die Summe wird in die Variable zurückgespeichert.
    1. Vor dem Hinzufügen wird eine binäre numerische Heraufstufung (§5.6.2) für den Wert 1 und den Wert der Variablen ausgeführt.
    2. Falls erforderlich, wird die Summe durch eine sich verengende primitive Konvertierung (§5.1.3) und/oder Boxing-Konvertierung (§5.1.7) auf den Typ der Variablen beschränkt, bevor sie gespeichert wird.
  3. Der Wert des Inkrements Postfix Ausdruck ist der Wert der Variablen, bevor der neue Wert gespeichert.

Der letzte Punkt ist der Schlüssel für diese Frage: Der Grund, warum Sie nicht arr[i]++ = v; tun können, die gleiche genaue Grund, warum Sie nicht x++ = v; tun können; Der Postfix-Inkrement-Ausdruck gibt einen -Wert zurück, keine Variable.

Von JLS 15.1 Evaluation, Denotation and Result:

Wenn ein Ausdruck in einem Programm ausgewertet wird (ausgeführt), ist das Ergebnis eines von drei Dingen bedeutet:

  • Eine Variable [...] (in C, dies wäre ein L-Wert)
  • Ein Wert [...]
  • Nichts (der Ausdruck wird gesagt, dass void)
genannt

Eine Zuordnung braucht eine Variable auf der linken Seite, und ein Wert ist eine Variable nicht, und das ist, warum Sie nicht x++ = v; tun können.

Von JLS 15.26 Assignment Operators:

Das Ergebnis des ersten Operanden eines Zuweisungsoperator muß eine Variable sein, oder ein Fehler bei der Kompilierung auftritt. Dieser Operand kann eine benannte Variable [...] oder eine berechnete Variable sein, wie sie sich aus einem [...] Feld oder einem Array-Zugriff ergeben kann. [...]

Der folgende Ausschnitt zeigt fehlerhafte Versuche, einen Wert zuweisen, von eher subtilen geht deutlicher:

int v = 42; 
int x = 0; 
x = v;  // OKAY! 
x++ = v;  // illegal! 
(x + 0) = v; // illegal! 
(x * 1) = v; // illegal! 
42 = v;  // illegal! 
    // Error message: "The left-hand side of an assignment must be a variable" 

Beachten Sie, dass den Postfix Schritt verwenden können Operator irgendwo auf der linken Seite eines Zuweisungsoperators, solange das Endergebnis eine Variable ist.

int[] arr = new int[3]; 
int i = 0; 
arr[i++] = 2; 
arr[i++] = 3; 
arr[i++] = 5; 
System.out.println(Arrays.toString(arr)); // prints "[2, 3, 5]" 
2

arr[i]++ bedeutet "erhöhen Sie den Wert von arr[i] um 1" und geben Sie den alten Wert zurück. Also setzt Ihr Code zuerst arr[i] zu i+1 mit arr[ i ] = i + 1;. Dann erhöht er es auf i + 2 unter Verwendung von arr[ i ]++ und druckt den Wert, den es hatte vor es wurde das zweite Mal erhöht, d. H. i + 1.

Sie können arr[ i ] = arr[i] + 1; nicht verwenden, da dies bedeutet "den Wert von arr[i] um 1 erhöhen und den neuen Wert zurückgeben".

Sie können arr[ i ]++ = i + 1; nicht tun, weil es keinen Sinn ergibt.

+1

Der Code erhöht nicht zuerst den Wert von arr [i]. Das wäre "arr [i] = arr [i] + 1". Aber es sagt 'arr [i] = i + 1'. Das ist anders. –

+0

@MarkByers: Du hast natürlich Recht. Fest. – sepp2k

0

arr[ i ]++ erhöht arr [i] um 1 könnte es sein:

arr[i] = i + 1; 

Was arr[ i ]++ = i + 1; bitte nicht versuchen, einen solchen Code zu schreiben. Selbst wenn es kompiliert wird, wird es für Sie oder für andere ein Puzzle sein.

PS Ich würde es vorziehen:

++arr[i]; 
+1

aber '++ arr [i]' wird ein anderes Ergebnis als 'arr [i] ++ 'ausgeben. –

+0

Ja, Sie haben Recht. Ich würde erhöhen: "++ arr [i]" in einer Zeile und Drucken in einer anderen Zeile. Ich denke, das wird besser lesbar sein. –

0

arr [i] ++ ist, den Wert von arr erhöhen [i] durch ein und weisen

wie für arr[ i ]++ = i + 1; Dieser Satz bedeutet etwas ganz anderes, ich Ich weiß nicht, dass es sogar valides Java ist, um ehrlich zu sein. Ich würde, wenn es funktioniert, den Wert bei arr [i] inferieren und ihn dann dem Index + 1 zuordnen;

3

Der Code System.out.println(arr[i]++) bedeutet dies:

int tmp = arr[i]; 
arr[i] = arr[i] + 1; 
System.out.println(tmp); 

Ihr zweites Beispiel nicht sinnvoll, weil Sie nicht den ++ Operator auf einen Wert verwenden können.

2

Der ++ Operator hat nichts mit Arrays zu tun. Es erhöht jede Integer-Variable (oder allgemeiner einen beliebigen L-Wert) um 1. Es ist dasselbe wie das i ++ in der Schleife.

Sie können entweder ++ x oder x ++ schreiben. Beide inkrementieren x, aber sie haben unterschiedliche Werte: ++ x gibt den neuen Wert von x zurück und x ++ gibt den alten Wert zurück. So druckt Ihr Code 1, 2, 3, 4 statt 2, 3, 4, 5.

Verwandte Themen