121 votes

Différences dans les opérateurs booléens : & vs && et | vs ||

Je connais les règles pour && et || mais quels sont & et |? S'il vous plaît, expliquez-moi cela avec un exemple.

0 votes

Voir ce message d'une excellente explication : stackoverflow.com/questions/7101992/...

151voto

Justin Niessner Points 144953

Il s'agit des opérateurs ET bit à bit et OU bit à bit.

int a = 6; // 110
int b = 4; // 100

// ET bit à bit    

int c = a & b;
//   110
// & 100
// -----
//   100

// OU bit à bit

int d = a | b;
//   110
// | 100
// -----
//   110

System.out.println(c); // 4
System.out.println(d); // 6

Merci à Carlos d'avoir signalé la section appropriée dans le Java Language Spec (15.22.1, 15.22.2) concernant les différents comportements de l'opérateur en fonction de ses entrées.

En effet, lorsque les deux entrées sont de type booléen, les opérateurs sont considérés comme des opérateurs logiques booléens et se comportent de manière similaire aux opérateurs Conditionnels-Et (&&) et Conditionnels-Ou (||) à l'exception du fait qu'ils ne court-circuitent pas, donc alors que ce qui suit est sûr:

if((a != null) && (a.something == 3)){
}

Ceci ne l'est pas:

if((a != null) & (a.something == 3)){
}

"Court-circuiter" signifie que l'opérateur n'examine pas nécessairement toutes les conditions. Dans les exemples ci-dessus, && examinera la deuxième condition seulement lorsque a n'est pas null (sinon toute l'instruction retournera false, et il serait inutile d'examiner les conditions suivantes de toute façon), donc l'instruction de a.something ne provoquera pas d'exception, ou est considérée comme "sûre".

L'opérateur & examine toujours chaque condition de la clause, donc dans les exemples ci-dessus, a.something peut être évalué lorsque a est en fait une valeur null, provoquant une exception.

1 votes

Voulait clarifier.. & reviendra à 1 seulement si les deux sont à 1? Donc 101 & 001 serait 001? Correct?

0 votes

@giddy @Jonathon - J'ai mis à jour mes valeurs pour mieux illustrer cette situation.

1 votes

Incomplet: ce sont aussi des opérateurs LOGIQUES (pour les booléens).

115voto

Torres Points 1641

Je pense que vous parlez de la signification logique des deux opérateurs, voici un résumé sous forme de tableau :

boolean a, b;

Opération      Signification               Remarque
---------      ------------               -------
   a && b      ET logique                 court-circuit
   a || b      OU logique                 court-circuit
   a &  b      ET logique booléen         pas de court-circuit
   a |  b      OU logique booléen         pas de court-circuit
   a ^  b      OU exclusif logique booléen
  !a          NON logique

court-circuit        (x != 0) && (1/x > 1)   SÛR
pas de court-circuit    (x != 0) &  (1/x > 1)   PAS SÛR

Évaluation en court-circuit, évaluation minimale ou évaluation de McCarthy (d'après John McCarthy) est la sémantique de certains opérateurs booléens dans certains langages de programmation où le deuxième argument est exécuté ou évalué uniquement si le premier argument ne suffit pas à déterminer la valeur de l'expression : lorsque le premier argument de la fonction ET évalue à faux, la valeur globale doit être faux ; et lorsque le premier argument de la fonction OU évalue à vrai, la valeur globale doit être vrai.

Pas Sûr signifie que l'opérateur examine toujours chaque condition dans la clause, donc dans les exemples ci-dessus, 1/x peut être évalué lorsque x est, en fait, une valeur 0, provoquant une exception.

1 votes

@Torres - Veuillez élargir votre réponse en expliquant "court-circuitage" et "sûr". Est-ce que "ou exclusif" et "non logique" ne sont pas non plus des "court-circuitages"? Et pourquoi l'appelle-t-on "non logique" au lieu de "non logique booléen"? Et pourquoi le "NON logique" n'est-il pas regroupé avec le "ET logique" et le "OU logique"? Bonne réponse mais nécessite du travail.

0 votes

@tfmontague, J'ai expliqué ce que signifie le court-circuit (en modifiant cette réponse).. En attendant que ma modification soit "examinée par les pairs."

0 votes

Qu'est-ce qui est "non sécurisé" concernant le non-court-circuit? Ne devrait-il pas être plus sûr que d'utiliser des court-circuits? Au fait: vous n'expliquez pas vraiment le terme "court-circuit". Cela signifie que sur "non-court-circuit" toutes les parties sont d'abord évaluées, puis l'opération booléenne est appliquée, tandis que sur court-circuit, l'évaluation s'arrête lorsque la première expression satisfait la condition, comme (a || b) n'évaluera pas b, si a est vrai et l'opération ou renverra vrai, peu importe ce que b est.

11voto

Fermin Points 12964

Découvrez l'évaluation par court-circuit.

Les opérateurs && et || ne vérifieront pas le deuxième argument si le premier argument est suffisant pour déterminer le résultat.

Par exemple

bool something = true;
bool anotherThing = false;
if (something && anotherThing)
//ou
if (something || anotherThing)

Dans l'exemple ci-dessus, la variable anotherThing ne sera pas évaluée car something = true, donc l'évaluation globale est vraie.

Lorsque vous utilisez & ou |, tous les arguments sont évalués, que le résultat global puisse être trouvé à partir du premier argument ou non.

7voto

Tassos Bassoukos Points 6872

Les opérateurs && et || sont des opérateurs de court-circuit, ce qui signifie qu'ils n'évalueront pas leur expression de droite si la valeur de l'expression de gauche est suffisante pour déterminer le résultat.

8 votes

-1 pour avoir dit à l'OP ce qu'il savait déjà et de ne pas avoir répondu à la question qu'il avait effectivement posée.

1voto

Bruno Points 47560

& et | sont des opérateurs bit à bit sur les types entiers (par exemple int) : http://download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

&& et || fonctionnent uniquement avec des booléens (et effectuent un court-circuit, comme d'autres réponses l'ont déjà mentionné).

3 votes

& et | sont également des opérateurs booléens sur les types booléens.

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