web-dev-qa-db-fra.com

Deux conditions en une si la déclaration importe-t-elle si la première est fausse?

D'accord, j'ai donc testé ce morceau de code et j'ai constaté qu'aucune exception n'était levée.

public static void main(String[] args) {
    int[] list = {1,2};
    if (list.length>2 && list[3] == 2){
        System.out.println(list[1]);
    }
}

Est-ce que la déclaration ici

if (list.length>2 && list[3] == 2)

signifie que si la première condition est fausse, nous n'avons même pas à vérifier la deuxième condition?

Ou cela équivaut à

if (list.length>2){
    if (list[3] == 2){
        ...
    }
}

?

Et que se passe-t-il s'il est écrit en C ou python ou dans d'autres langages?

Merci

30
albusshin

Il est courant que les langages (Java et Python en font partie) évaluent le premier argument d'un AND logique et terminent l'évaluation de l'instruction si le premier argument est false. En effet:

De L'ordre d'évaluation des opérateurs logiques ,

Lorsque Java évalue l'expression d = b && c ;, il vérifie d'abord si b est vrai. Ici b est faux, donc b && c doit être faux, que c soit ou non vrai , donc Java ne prend pas la peine de vérifier la valeur de c.

Ceci est connu sous le nom de évaluation de court-circuit , et est également mentionné dans les Java docs .

Il est courant de voir list.count > 0 && list[0] == "Something" Pour vérifier un élément de liste, s'il existe.


Il convient également de mentionner que if (list.length>2 && list[3] == 2) est pas égal au deuxième cas

if (list.length>2){
    if (list[3] == 2){
        ...
    }
}

s'il y a un else après. Le else ne s'appliquera qu'à l'instruction if à laquelle il est attaché.

Pour démontrer ce piège:

if (x.kind.equals("Human")) {
    if (x.name.equals("Jordan")) {
        System.out.println("Hello Jordan!");
    }
} else {
    System.out.println("You are not a human!");
}

fonctionnera comme prévu, mais

if (x.kind.equals("Human") && x.name.equals("Jordan")) {
    System.out.println("Hello Jordan!");
} else {
    System.out.println("You are not a human!");
}

indiquera également à tout humain qui n'est pas Jordan qu'il n'est pas humain.

47
Elle

Oui. Si la première condition n'est pas remplie, les autres ne sont pas évaluées. Ceci est connu sous le nom de court-circuitage . Voir ici pour plus de détails. Notez que ce n'est pas particulier à Java et beaucoup d'autres langages feront de même.

16
Brian Agnew

Dès le javadoc:

Les opérateurs conditionnels

Les && et || Les opérateurs effectuent les opérations Conditional-AND et Conditional-OR sur deux expressions booléennes. Ces opérateurs présentent un comportement de "court-circuit", ce qui signifie que le deuxième opérande n'est évalué qu'en cas de besoin.

&& Conditionnel-ET || Conditionnel-OU

9
Juned Ahsan

Oui, les deux utilisations sont sémantiquement équivalentes ... Autrement dit, à moins que la longueur ne soit> 2, le code est autorisé à accéder à plus que le 2e élément.

Dans le premier cas, ce qui compte c'est le && opérateur, pensez-y comme: si la première condition est vraie alors appliquer la deuxième condition.

La condition suivante a également une clause implicite "alors"

if length greater than two
 then access third element
4
Lews Therin

Vous avez spécifié dans votre instruction IF que les deux conditions doivent être remplies pour que System.out.println soit exécuté. Donc, si la première condition elle-même échoue, la deuxième condition n'est pas vérifiée (c'est pour l'opérateur AND). Mais la deuxième condition sera vérifiée si vous avez spécifié l'opérateur OR dans l'instruction If.

3
Smitha

Si la première condition est fausse, elle ne vérifiera pas la deuxième condition comme quoi que ce soit && F = F encore une fois, cela dépend de l'opération binaire que vous faites. comme dans le cas de OR (||) si la première condition est vraie (T), il ne vérifiera pas la deuxième condition comme quoi que ce soit || T = T mais si c'est faux (F) alors il le fera certainement vérifier pour la deuxième

3
Mangesh Date