365 votes

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

J'ai toujours utilisé || (deux barres verticales) dans les expressions OR, aussi bien en C# qu'en PHP. De temps en temps, je vois une seule barre utilisée : |. Quelle est la différence entre ces deux utilisations ? Y a-t-il des précautions à prendre lors de l'utilisation de l'un par rapport à l'autre ou sont-ils interchangeables ?

562voto

Michael Stum Points 72046

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

Par exemple:

if(condition1 || condition2 || condition3)

Si la condition1 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 la 1 est déjà vraie. 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 un gros hic, les références nulles ou des problèmes similaires. Par exemple:

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

Si classe est null, l'instruction if s'arrêtera après que classe != null est faux. Si vous utilisez seulement &, il essaiera de vérifier classe.someVar et vous obtiendrez une jolie NullReferenceException. Avec l'opérateur Ou, cela ne sera peut-être pas autant 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 les opérateurs simples & ou |, sauf si vous avez une conception où chaque condition est une fonction qui DOIT être exécutée. Cela semble être un problème de conception, mais parfois (rarement), c'est une façon propre de faire les choses. L'opérateur & exécute "ces 3 fonctions, et si l'une d'elles renvoie false, exécute le bloc else", tandis que le | fait "exécuter le bloc else uniquement si aucune ne renvoie false" - peut être utile, mais comme mentionné, c'est souvent un problème de conception.

Il y a cependant une deuxième utilisation de l'opérateur | et & : Opérations logiques.

9 votes

Oui, je n'y croyais pas jusqu'à ce que je crée une application console - mais mon Dieu ! Pourquoi vous donneraient-ils la corde pour vous pendre ! Je détestais ça à propos de VB.NET - les mots-clés OrElse and AndAlso!

2 votes

Aimer la nature en court-circuit de ces commandes! J'utilise ceci tout le temps pour exécuter uniquement la deuxième vérification si la première réussit, une vérification d'objet nul par exemple: if(myObj != null && myObj.resultCode == 0) Console.WriteLine("Youpi!");

0 votes

Bien sûr, peut-être que je devrais lire la réponse complète avant de dupliquer une partie!

88voto

Evan Shaw Points 7957

|| est l'opérateur logique OR. On dirait que tu sais déjà ce que c'est. Il est utilisé dans des déclarations conditionnelles comme if, while, etc.

condition1 || condition2

Est évalué à vrai si condition1 OU condition2 est vrai.

| est l'opérateur OR binaire. Il est utilisé pour opérer sur deux nombres. On regarde chaque bit de chaque nombre individuellement et, si l'un des bits est égal à 1 dans au moins l'un des nombres, alors le bit résultant sera aussi 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 c'est clair.

Donc pour répondre aux deux dernières questions, je dirais qu'il n'y a pas de pièges à 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.

0 votes

Cela m'a aidé à comprendre comment quelqu'un utilisait l'opérateur OR Bitwise pour fusionner des filtres dans le pilote Mongodb C#. gist.github.com/a3dho3yn/…

3 votes

"Il est utilisé pour opérer sur deux nombres" Ceci est une description inexacte/incomplète. if (true | false) est parfaitement valide en C#.

36voto

nsanders Points 5282

Un est un "ou bit à bit".

10011b | 01000b => 11011b

L'autre est un ou logique.

true ou false => true

3 votes

| peut également être utilisé sur les types bool sans opération de court-circuit.

0 votes

Pour toute personne qui n'est pas familière avec les opérateurs de bits, l'exemple de résultat est obtenu parce que chaque ligne de bits de chaque colonne est testée les unes contre les autres en utilisant une comparaison OU. docs.microsoft.com/fr-fr/cpp/c-language/c-bitwise-operators

17voto

Trevor Abell Points 447

Bonne question. Ces deux opérateurs fonctionnent de la même façon en PHP et en C#.

| est un OU bit à bit. Il comparera deux valeurs en fonction de leurs bits. Par exemple, 1101 | 0010 = 1111. Ceci est extrêmement utile lors de l'utilisation d'options de bits. Par exemple, Lire = 01 (0X01) Écrire = 10 (0X02) Lire-Écrire = 11 (0X03). Un exemple utile serait l'ouverture de fichiers. Un exemple simple serait :

File.Open(FileAccess.Read | FileAccess.Write);  // Donne accès en lecture/écriture au fichier

|| est un OU logique. C'est la manière dont la plupart des gens pensent à la condition OR 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(Nom == "Admin" || Nom == "Développeur") { // autoriser l'accès } // vérifie si le nom est égal à Admin OU si le nom est égal à Développeur

Ressource PHP : https://www.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

4 votes

FWIW, Techniquement, en C# | est un ou logique lorsqu'il est appliqué aux booléens. Comme le dit votre référence liée. 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 true et false sont telles qu'un ou bit à bit de leurs valeurs produit exactement le même résultat qu'un ou logique. C'est-à-dire que (int)(bool1 | bool2) == ((int)bool1) | ((int)bool2).

5voto

vishesh Points 575

Exemple simple en java

public class Driver {

  static int x;
  static int y;

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

System.out.println("utilisation de double barre verticale");
    if(setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }

System.out.println("utilisation de barre verticale simple");
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;
  }
}

sortie :

utilisation de double barre verticale
x = 5
y = 0
utilisation de barre verticale simple
x = 5
y = 5

2 votes

Pourquoi donneriez-vous un exemple en java pour une question qui ne mentionne même pas java ?

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