Le contenu des deux éléments suivants si des blocs doivent être exécutés:
if( booleanFunction() || otherBooleanFunction() ) {...}
if( booleanFunction() | otherBooleanFunction() ) {...}
Alors, quelle est la différence entre |
et ||
?
Remarque: j'ai examiné la question et trouvé ma propre réponse, que j'ai incluse ci-dessous. N'hésitez pas à me corriger ou à donner votre propre point de vue. Il y a sûrement place à amélioration!
L'opérateur logique fonctionne sur des booléens et l'opérateur au niveau des bits sur des bits. Dans ce cas, l'effet sera le même, mais il y a deux différences:
Voici un code pratique pour le prouver:
public class OperatorTest {
public static void main(String[] args){
System.out.println("Logical Operator:");
if(sayAndReturn(true, "first") || sayAndReturn(true, "second")){
//doNothing
}
System.out.println("Bitwise Operator:");
if(sayAndReturn(true, "first") | sayAndReturn(true, "second")){
//doNothing
}
}
public static boolean sayAndReturn(boolean ret, String msg){
System.out.println(msg);
return ret;
}
}
Les deux ont des usages différents. Bien que dans de nombreux cas (lorsqu'il s'agit de booléens), ils puissent sembler avoir le même effet, il est important de noter que le OU-logique est un court-circuit, ce qui signifie que si son premier argument a la valeur true, le second argument est laissé. non évalué. L'opérateur au niveau du bit évalue les deux arguments indépendamment.
De même, l’opérateur AND logique est un court-circuit, ce qui signifie que si son premier argument est évalué à false, le second est laissé non évalué. Encore une fois, le bitwise-AND n'est pas.
Vous pouvez voir cela en action ici:
int x = 0;
int y = 1;
System.out.println(x+y == 1 || y/x == 1);
System.out.println(x+y == 1 | y/x == 1);
La première instruction print fonctionne très bien et renvoie true car le premier argument est évalué à true et l'évaluation est donc arrêtée. La deuxième instruction d'impression se trompe puisqu'il ne s'agit pas d'un court-circuit et qu'une division par zéro est rencontrée.
pour les programmeurs, il n'y a qu'une seule différence.
booleanFunction () || otherBooleanFunction () sera vrai si l’un est vrai. De même, booleanFunction () && otherBooleanFunction () sera faux si l'un ou l'autre est faux. Alors, pourquoi tester l'autre. c'est ce que font les opérateurs logiques.
Mais au niveau des bits, vérifiez les deux. Une application fréquente de ce concept est la suivante.
if(someObject != null && someObject.somemethod())
Donc, dans ce cas, si vous remplacez &&
par &
, attendez un sinistre. Vous obtiendrez bientôt une méchante NullPointerException ...
if( booleanFunction() || otherBooleanFunction() ) {...}
Dans cette condition, si booleanFunction()
renvoie true
, alors otherBooleanFunction()
ne sera pas exécuté.
if( booleanFunction() | otherBooleanFunction() ) {...}
Mais dans l'opérateur des bits, les deux fonctions - booleanFunction()
et otherBooleanFunction()
seraient exécutées, peu importe booleanFunction()
, renvoie true
ou false
Différence entre opérateur logique et bits par bits - 1. L'opérateur au niveau du bit travaille sur le bit alors que l'opérateur logique travaille sur l'instruction. 2. Bitwise et est représenté par & alors que logique et est représenté par &&. 3. Bitwise ou est représenté par | alors que ou est représenté par ||.