147 votes

&& (AND) et || (OU) dans les instructions IF

Ma question est peut-être très basique, mais je pense que c'valeurs de demander. J'ai le code suivant:

if(!partialHits.get(req_nr).containsKey(z) || partialHits.get(req_nr).get(z) < tmpmap.get(z)){  
    partialHits.get(z).put(z, tmpmap.get(z));  
}

partialHits est une table de hachage. Ce qui va se passer si la première affirmation est vraie? Va Java tout de même vérifier la deuxième déclaration? Parce que pour la première instruction pour être vrai, la table de hachage ne doit pas contenir la clé donnée, donc si la deuxième déclaration est vérifiée, je l'aurai NullPointerException.
Donc, en termes simples, si nous avons le code suivant

if(a && b)  
if(a || b)

serait Java vérifiez b si a qui est faux dans le premier cas, et si l' a qui est vrai dans le deuxième cas?

220voto

Andreas_D Points 64111

Non, cela ne sera pas évalué. Et c'est très utile. Comme vous devez tester, si une chaîne n'est pas nulle ou vide, vous pouvez écrire:

 if (str != null && !str.isEmpty()) {
  doSomethingWith(str.charAt(0));
}
 

ou l'inverse

 if (str == null || str.isEmpty()) {
  complainAboutUnusableString();
} else {
  doSomethingWith(str.charAt(0));
}
 

Si nous n'avions pas de "courts-circuits" en Java, nous recevrions beaucoup d'exceptions NullPointerExceptions dans les lignes de code ci-dessus.

70voto

Hardcoded Points 2786

Java dispose de 5 différents boolean comparer les opérateurs: &, &&, |, ||, ^

& et & & "et" opérateurs | et || "ou" opérateurs, ^ est "xor"

Le seul plus de vérifier tous les paramètres, quelles que soient les valeurs, avant de vérifier les valeurs des paramètres. Le double de ceux de la première case à gauche du paramètre et sa valeur et s' true (||) ou false (&&) sortir de la seconde personne indifférent. Son compilcated? Un exemple simple doit préciser:

Pour tous les exemples:

 String aString = null;

ET:

 if (aString != null & aString.equals("lala"))

Les deux paramètres sont vérifiés avant l'évaluation est effectuée et un NullPointerException sera levée pour le deuxième paramètre.

 if (aString != null && aString.equals("lala"))

Le premier paramètre est vérifié, et il retourne false, de sorte que le deuxième paramètre ne sera pas vérifié, parce que le résultat est false de toute façon.

La même chose pour OU:

 if (aString == null | !aString.equals("lala"))

Va augmenter NullPointerException, trop.

 if (aString == null || !aString.equals("lala"))

Le premier paramètre est vérifié, et il retourne true, de sorte que le deuxième paramètre ne sera pas vérifié, parce que le résultat est true de toute façon.

XOR ne peut pas être optimisé, car elle dépend de deux paramètres.

27voto

Non, cela ne sera pas vérifié. Ce comportement s'appelle l' évaluation de court-circuit et est une fonctionnalité disponible dans de nombreux langages, y compris Java.

20voto

Cowan Points 17235

Toutes les réponses ici sont grands, mais, juste pour illustrer où cela provient, pour des questions de ce genre, il est bon d'aller à la source: la Java Langage de Spécification.

Section 15:23, Conditionnel opérateur Et (&&), dit:

Le && est l'opérateur & (§15.22.2), mais évalue sa droite opérande seulement si la valeur de sa main gauche opérande est vrai. [...] Au moment de l'exécution, la gauche opérande expression est évaluée en premier [...] si la valeur est false, la valeur du conditionnel-et l'expression est fausse, et la partie droite de l'opérande expression n'est pas évaluée. Si la valeur de gauche opérande est vrai, alors la partie droite de l'expression est évaluée [...] la valeur qui en résulte devient la valeur de conditionnel et de l'expression. Ainsi, && calcule le même résultat que sur le opérandes booléens. Il ne diffère en ce que la partie droite de l'opérande expression est évaluée de façon conditionnelle plutôt que de toujours.

Et de même, l'Article 15:24, Conditionnel Ou de l'exploitant (||), dit:

L'opérateur || est comme | (§15.22.2), mais évalue sa droite opérande seulement si la valeur de sa main gauche opérande est faux. [...] Au moment de l'exécution, la gauche opérande expression est évaluée en premier; [...] si la valeur est true, la valeur du conditionnel ou de l'expression est vraie et que la droite opérande expression n'est pas évaluée. Si la valeur de gauche opérande est faux, alors la partie droite de l'expression est évaluée; [...] la valeur qui en résulte devient la valeur du conditionnel ou de l'expression. Ainsi, || calcule le même résultat que | booléen ou opérandes Booléens. Il ne diffère en ce que la partie droite de l'opérande expression est évaluée de façon conditionnelle plutôt que de toujours.

Un peu répétitif, peut-être, mais la meilleure confirmation de exactement comment ils fonctionnent. De même, l'opérateur conditionnel (?:) évalue seulement "la moitié" (à gauche de la moitié si la valeur est true, la moitié droite si c'est faux), permettant l'utilisation d'expressions comme:

int x = (y == null) ? 0 : y.getFoo();

sans une NullPointerException.

4voto

abyx Points 15304

Non, Java court-circuitera et cessera d'évaluer dès qu'il aura connaissance du résultat.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X