Duplicata possible:
ne explication claire et profane de la différence entre | et || en c #?
Quelle est la différence entre comparer avec | et || ou & et && en C # et Javascript?
Exemples:
if(test == test1 | test1 == test2) or if(test == test1 || test1 == test2)
if(test == test1 & test1 == test2) or if(test == test1 && test1 == test2)
en C (et dans d'autres langues probablement) un seul |
ou &
est une comparaison au niveau du bit.
Le double ||
ou &&
est une comparaison logique.
Edit: Assurez-vous de lire le commentaire de Mehrdad ci-dessous concernant "sans court-circuit"
En pratique, puisque true
est souvent équivalent à 1
et false
est souvent équivalent à 0
, les comparaisons au niveau du bit peuvent parfois être valides et retourner exactement le même résultat.
Il y avait une fois un composant logiciel essentiel sur lequel j'ai exécuté un analyseur de code statique et il a souligné qu'une comparaison au niveau du bit était utilisée là où une comparaison logique aurait dû être. Comme il a été écrit en C et en raison de la disposition des comparaisons logiques, le logiciel a très bien fonctionné avec les deux. Exemple:
if ( (altitide > 10000) & (knots > 100) )
...
& et | sont des opérateurs au niveau du bit qui peuvent fonctionner à la fois sur des arguments entiers et booléens, et && et || sont des opérateurs logiques qui ne peuvent fonctionner que sur des arguments booléens. Dans de nombreuses langues, si les deux arguments sont booléens, la principale différence est que les opérateurs logiques effectueront une évaluation de court-circuit et n'évalueront pas le deuxième argument si le premier argument est suffisant pour déterminer la réponse (par exemple dans le cas de &&, si le premier argument est faux, le deuxième argument n'est pas pertinent).
& et | sont des opérateurs binaires alors que || et && sont booléens.
La grande différence:
(1 & 2) est 0, faux
(1 && 2) est vrai
(En supposant C, C++, Java, JavaScript)
|
et &
sont des opérateurs au niveau du bit tandis que ||
et &&
sont des opérateurs logiques. Habituellement, vous souhaitez utiliser ||
et &&
pour les instructions if et les boucles et autres (c'est-à-dire pour vos exemples ci-dessus). Les opérateurs au niveau du bit permettent de définir et de vérifier les bits dans les masques de bits.
L'instance dans laquelle vous utilisez un seul caractère (c'est-à-dire | ou &) est une comparaison au niveau du bit des résultats. Tant que votre langue évalue ces expressions à une valeur binaire, elles doivent renvoyer les mêmes résultats. Cependant, comme meilleure pratique, vous devez utiliser l'opérateur logique car c'est ce que vous voulez dire (je pense).
Le & et | sont généralement des opérations au niveau du bit.
Où as && et || sont généralement des opérations logiques.
À des fins de comparaison, c'est très bien à condition que tout retourne un 1 ou un 0. Sinon, il peut retourner des faux positifs. Vous devez cependant éviter cela pour éviter les bogues difficiles à lire.