2017-04-19 3 views
0

J'ai écrit le code suivant pour inverser la chaîne donnée:Comment fonctionne après l'opérateur ++ Increment tandis que l'initialisation

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]; 
} 

Selon mon initialisation de compréhension se produit de droit-gauche. Par conséquent, strToChar[strToChar.length-j] ici devrait jeter ArrayIndexOutOfBoundException.

Mais ça marche bien. Comment cela se passe-t-il? Ne devrait-il pas évaluer cela?

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

, vous attribuez 'outString [0] = strToChar [6- 1] 'ici, ce qui n'entraînera aucune erreur. La clef ici est le 'j ++' qui conduira à la partie droite ne jette pas une exception, car la variable d'assignation gauche augmentera la valeur 'j' due au postincrement – SomeJavaGuy

+0

Le [JLS] (https://docs.oracle .com/javase/specs/jls/se8/html/jls-15.html # jls-15.7) stipule: "Le langage de programmation Java garantit que les opérandes des opérateurs semblent être évalués dans un ordre d'évaluation spécifique, à savoir, depuis _left à droite_." – Thomas

Répondre

1

Si je regarde votre code, vous avez écrit votre condition

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

ici strToChar.length vous retourne la longueur réelle du tableau qui est 6.

La manière correcte pour itérer un tableau avec boucle serait:

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

L'indice à partir de 0 et va < strToChar.length

+0

bien la dernière partie manquante de la boucle for est la principale raison pour laquelle il n'y a pas d'exception. Donc, avec l'implémentation actuelle, il faudrait soit le changer en strToChar [strToChar.length-j-1] 'soit il risquerait de tomber dans l'exception qu'il était curieux de ne pas être soulevé. – SomeJavaGuy

+0

@SomeJavaGuy C'est vrai! –

+0

"La façon correcte d'itérer un tableau avec la boucle for [...]" non, de cette façon n'est pas "la bonne façon", c'est la manière la plus courante. Le code d'OP est quelque peu rare mais fonctionne très bien. – Gabriel

0

Acording à la java doc:

Les garanties de langage de programmation Java que les opérandes de opérateurs semblent être évalués dans un ordre d'évaluation spécifique , , à savoir, de gauche à droite.

Ce qui signifie j est incrémenté avant d'évaluer le côté droit de l'expression.

donc en conséquence ce code:

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

est évaluée à:

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

au lieu de:

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