2017-04-19 2 views
0

ich folgenden Code geschrieben habe, den gegebenen String zu umkehren:Wie Post Increment ++ Operator arbeitet, während der Initialisierung

String str = "abcdef"; 
char[] strToChar = str.toCharArray(); 
char[] outString = new char[strToChar.length]; 

for(int j = 0; j < strToChar.length;) { 
    int len = strToChar.length-j; 
    outString[j++] = strToChar[strToChar.length-j]; 
} 

Gemäß meinem Verständnis Initialisierung von Recht-links passiert. Daher sollte strToChar[strToChar.length-j] hier ArrayIndexOutOfBoundException werfen.

Aber es läuft gut. Wie ist das passiert? Sollte es das nicht bewerten?

outString[0] = strToChar[6]; //This should throw exception 
+1

gut ordnen Sie 'OutString [0] = strToChar [6- 1] 'hier, was zu keinem Fehler führen wird. Der Schlüssel hier ist 'j ++', was dazu führt, dass der rechte Teil keine Ausnahme auslöst, da die linke Zuweisungsvariable den 'j' Wert aufgrund der Postinkrementierung erhöht. – SomeJavaGuy

+0

Die [JLS] (https://docs.oracle "Die Java - Programmiersprache garantiert, dass die Operanden von Operatoren in einer bestimmten Bewertungsreihenfolge ausgewertet zu werden scheinen, nämlich von _left" (http://javas.com/specs/jls/se8/html/jls-15.html # jls-15.7) nach rechts_." – Thomas

Antwort

1

Wenn ich auf den Code schauen, dann haben Sie Ihren Zustand geschrieben

for(int j = 0; j < strToChar.length;) 

hier strToChar.length sein werden Sie die tatsächliche Länge des Feldes zurück, die 6 ist

Der richtige Weg ein Array mit iterieren for-Schleife wäre:

for(int j = 0; j < strToChar.length;j++) 

Der Index beginnend bei 0 und geht bis < strToChar.length

+0

gut der fehlende letzte Teil der for-Schleife ist der Hauptteil, warum es keine Ausnahme gibt. Bei der aktuellen Implementierung müsste er entweder in 'strToChar [strToChar.length-j-1]' geändert werden, oder er würde in die Exception geraten, die er nicht interessiert. – SomeJavaGuy

+0

@SomeJavaGuy Das stimmt! –

+0

"Der richtige Weg, um ein Array mit For-Schleife zu iterieren [...]" Nein, so ist nicht "der richtige Weg", es ist der häufigste Weg. Der OP-Code ist etwas ungewöhnlich, funktioniert aber gut. – Gabriel

0

zum java Acording doc:

der Programmiersprache Java garantiert, dass die Operanden von Operatoren erscheinen in einer bestimmten Auswertung bewertet werden, , nämlich von links nach rechts.

Welche j bedeutet erhöht, bevor die rechte Seite des Ausdrucks auswertet.

So entsprechend dieser Code:

outString[j++] = strToChar[strToChar.length-j]; 

wird ausgewertet:

outString[0] = strToChar[6-1]; 

statt:

outString[0] = strToChar[6-0]; 
Verwandte Themen