Quelle est la différence entre le | et || ou opérateurs?

300

J'ai toujours utilisé ||(deux canaux) dans les expressions OR, à la fois en C # et PHP. De temps en temps , je vois un seul tuyau utilisé: |. Quelle est la différence entre ces deux usages? Y a-t-il des mises en garde lors de l'utilisation de l'une sur l'autre ou sont-elles interchangeables?

GloryFish
la source

Réponses:

488

Tout comme l' opérateur &et &&, l'opérateur double est un opérateur de "court-circuit".

Par exemple:

if(condition1 || condition2 || condition3)

Si la condition 1 est vraie, les conditions 2 et 3 ne seront PAS vérifiées.

if(condition1 | condition2 | condition3)

Cela vérifiera les conditions 2 et 3, même si 1 est déjà vrai. Comme vos conditions peuvent être des fonctions assez coûteuses, vous pouvez obtenir une bonne amélioration des performances en les utilisant.

Il y a une grosse mise en garde, NullReferences ou des problèmes similaires. Par exemple:

if(class != null && class.someVar < 20)

Si la classe est null, l'instruction if s'arrêtera après class != nullest false. Si vous utilisez uniquement &, il essaiera de vérifier class.someVaret vous obtiendrez une belle NullReferenceException. Avec l'Or-Opérateur, ce n'est peut-être pas vraiment un piège car il est peu probable que vous déclenchiez quelque chose de mauvais, mais c'est quelque chose à garder à l'esprit.

Personne n'utilise jamais le single &ou les |opérateurs, sauf si vous avez une conception où chaque condition est une fonction qui DOIT être exécutée. Cela ressemble à une odeur de design, mais parfois (rarement) c'est une façon propre de faire des choses. L' &opérateur "exécute ces 3 fonctions, et si l'une d'elles retourne false, exécute le bloc else", tandis |que "n'exécute le bloc else que si aucune ne retourne false" - peut être utile, mais comme dit, souvent c'est une conception odeur.

Il y a une deuxième utilisation des |et &opérateur cependant: au niveau du bit opérations .

Michael Stum
la source
9
Oui, je n'y ai pas cru avant d'avoir créé une application console - mais bon seigneur! Pourquoi vous donneraient-ils la corde pour vous pendre! Je détestais ça à propos de VB.NET - les mots-clés OrElse et AndAlso!
Jarrod Dixon
24
Apprendre aux gens à utiliser &et en |tant qu'opérateurs conditionnels est un hack, et leur causera des ennuis s'ils ont besoin d'utiliser C / C ++: 1 && 2est vrai tandis que 1 & 2est faux.
BlueRaja - Danny Pflughoeft
47
Ce n'est pas un hack, il est officiellement spécifié pour C # dans la section 7.10.3 Opérateurs logiques booléens: "Le résultat de x | y est vrai si x ou y est vrai. Sinon, le résultat est faux." Voir aussi Section 7.11 Opérateurs logiques conditionnels: "L'opération x || y correspond à l'opération x | y, sauf que y n'est évalué que si x est faux." qui "légalise" davantage | comme opérateur conditionnel. Et les gens qui utiliseront C / C ++ seront de toute façon en difficulté s'ils supposent aveuglément que les choses fonctionnent également. Comme dit: en utilisant | dans une instruction if est une odeur de conception, mais une opération parfaitement légale.
Michael Stum
9
Je n'ai jamais dit que ce n'était pas légal, juste que c'est un hack, ce qu'il est (vous utilisez &pour transmettre un sens autre que ce qu'il signifie presque toujours: bit à bit et) .
BlueRaja - Danny Pflughoeft
15
@ BlueRaja-DannyPflughoeft Appeler une fonctionnalité documentée un hack lorsque la documentation indique qu'elle était destinée à être utilisée, revient à dire utiliser une instruction switch "an elseif hack". C'est un outil dans la boîte à outils, un outil spécialisé rarement utilisé peut-être, mais un outil néanmoins.
Gent
80

|| est l'opérateur logique OU. Il semble que vous sachiez ce que c'est. Il est utilisé dans les instructions conditionnelles telles que if, while, etc.

condition1 || condition2

Évalue à vrai si l'une des conditions1 OU condition2 est vraie.

| est l'opérateur OR au niveau du bit. Il est utilisé pour fonctionner sur deux nombres. Vous examinez chaque bit de chaque nombre individuellement et, si l'un des bits est égal à 1 dans au moins l'un des nombres, le bit résultant sera également égal à 1. Voici quelques exemples:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

J'espère que cela a du sens.

Donc, pour répondre aux deux dernières questions, je ne dirais pas qu'il y a des mises en garde à part "connaître la différence entre les deux opérateurs". Ils ne sont pas interchangeables car ils font deux choses complètement différentes.

Evan Shaw
la source
Cela m'a aidé à comprendre comment quelqu'un utilisait l'opérateur OR au niveau du bit pour fusionner les filtres dans le pilote Mongodb C #. gist.github.com/a3dho3yn/…
Donny V.
30

L'un est un "au niveau du bit ou".

10011b | 01000b => 11011b

L'autre est une logique ou.

vrai ou faux => vrai

nsanders
la source
2
|peut également être utilisé sur les booltypes sans court-circuit.
juharr
14

Bonne question. Ces deux opérateurs fonctionnent de la même manière en PHP et en C #.

|est un OU au niveau du bit. Il comparera deux valeurs par leurs bits. Par exemple: 1101 | 0010 = 1111. Ceci est extrêmement utile lors de l'utilisation des options de bits. Par exemple, lecture = 01 (0X01) écriture = 10 (0X02) lecture-écriture = 11 (0X03). Un exemple utile serait d'ouvrir des fichiers. Un exemple simple serait:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

||est un OU logique. C'est la façon dont la plupart des gens pensent de la RO et compare deux valeurs en fonction de leur vérité. Par exemple, je vais au magasin ou je vais au centre commercial. C'est celui utilisé le plus souvent dans le code. Par exemple:

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

Ressource PHP: http://us3.php.net/language.operators.bitwise

Ressources C #: http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

Trevor Abell
la source
4
FWIW, Techniquement, en C # |est une logique ou lorsqu'il est appliqué aux booléens . Comme vos états de référence liés. En pratique, le résultat final est le même que s'il s'agissait d'un opérateur bit à bit, car les valeurs bit à bit de trueet falsesont telles qu'un bit à bit ou à leurs valeurs produit exactement le même résultat qu'un logique ou le fait. C'est (int)(bool1 | bool2)== ((int)bool1) | ((int)bool2).
ToolmakerSteve
4

Exemple simple en java

public class Driver {

  static int x;
  static int y;

public static void main(String[] args) 
throws Exception {

System.out.println("using double pipe");
    if(setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }



System.out.println("using single pipe");
if(setX() | setY())
    {System.out.println("x = "+x);
    System.out.println("y = "+y);
    }

}

 static boolean setX(){
      x=5;
     return true;
  }
 static boolean setY(){
      y=5;
      return true;
  }
}

production :

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5
vishesh
la source
2
Pourquoi donneriez-vous un exemple java pour une question qui ne mentionne même pas java?
juharr
4

& - (Condition 1 & Condition 2): vérifie les deux cas même si le premier est faux

&& - (Condition 1 && Condition 2): ne prenez pas la peine de vérifier le deuxième cas si le premier est faux

&& - l'opérateur fera fonctionner votre code plus rapidement, professionnellement et est rarement utilisé

| - (Condition 1 | Condition 2): vérifie les deux cas même si le cas 1 est vrai

|| - (Condition 1 || Condition 2): ne vous embêtez pas à vérifier le deuxième cas si le premier est vrai

|| - l'opérateur fera fonctionner votre code plus rapidement, professionnellement | est rarement utilisé

Bhai Saab
la source
2
rarely used? Tout dépend de ce que vous voulez ou devez faire.
Emaborsa
1
Génial! Court et doux, je supprimerais le "| est rarement utilisé" et "& est rarement utilisé" parce que, comme Emaborsa l'a dit, cela dépend vraiment de ce que vous voulez ou devez faire.
Iannick
0

Le tube unique, |, est l'un des opérateurs au niveau du bit .

De Wikipédia:

Dans la famille des langages de programmation C, l'opérateur OR au niveau du bit est "|" (tuyau). Encore une fois, cet opérateur ne doit pas être confondu avec son homologue booléen "logique ou", qui traite ses opérandes comme des valeurs booléennes, et est écrit "||" (deux tuyaux).

codeLes
la source
0

Par leur définition mathématique, OR et AND sont des opérateurs binaires; ils vérifient les conditions LHS et RHS indépendamment, de la même manière que | et &.

|| et && modifient les propriétés des opérateurs OR et AND en les arrêtant lorsque la condition LHS n'est pas remplie.

Dragos Bandur
la source
-1

Le | L'opérateur exécute un OU au niveau du bit de ses deux opérandes (ce qui signifie que les deux côtés doivent évaluer false pour qu'il renvoie false) tandis que || L'opérateur n'évaluera le deuxième opérateur que s'il en a besoin.

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx

maison de campagne
la source
Si vous avez lu ces articles, vous auriez vu qu'ils font référence à des opérateurs au niveau du bit
johnc
Ce n'est pas ce que signifie au niveau du bit.
juharr
-1

Le singe pipe "|" est le "bit à bit" ou et ne doit être utilisé que lorsque vous savez ce que vous faites. Le double tuyau "||" est un ou logique, et peut être utilisé dans des instructions logiques, comme "x == 0 || x == 1".

Voici un exemple de ce que fait le bit à bit: si a = 0101 et b = 0011, alors a | b = 0111. Si vous traitez avec un système logique qui traite tout non différent de zéro comme vrai, le bitwise ou agira de la même manière que le logique ou, mais son homologue (bitwise et, "&") ne le sera PAS. Également au niveau du bit ou n'effectue pas d'évaluation de court-circuit.

Kyle Cronin
la source
«|» peut également être utilisé sur des booltypes sans court-circuit.
juharr
-2

Un seul tube (|) est l' opérateur OR au niveau du bit .

Deux canaux (||) est l'opérateur logique OU.

Ils ne sont pas interchangeables.

Danois
la source
1
Si vous ignorez l'opération au niveau du bit, le double tuyau est une évaluation paresseuse et le simple tuyau est gourmand, dans la zone d'opérateur logique.
Alex