Quelle est la différence entre logique et conditionnel ET, OU en C #?

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

Logique ET et OU:

(x & y) (x | y) 

Conditionnel ET et OU:

 (x && y) (x || y) 

J’ai seulement connu des opérandes conditionnels jusqu’à ce point. Je sais ce qu’il fait et comment l’appliquer dans les if-déclarations. Mais quel est le but des opérandes logiques?

Je préfère le considérer comme “bit à sens vs conditionnel” plutôt que “logique vs conditionnel” puisque le concept général de “logique” s’applique dans les deux cas.

 x & y // bitwise AND, 0101 & 0011 = 0001 x | y // bitwise OR, 0101 | 0011 = 0111 x && y // true if both x and y are true x || y // true if either x or y are true 

modifier

À la demande générale, je devrais également mentionner que les arguments sont évalués différemment. Dans la version conditionnelle, si le résultat de l’opération entière peut être déterminé par le premier argument, le second argument n’est pas évalué. Ceci s’appelle l’évaluation de court-circuit. Les opérations binarys doivent évaluer les deux côtés afin de calculer la valeur finale.

Par exemple:

 x.foo() && y.bar() 

Cela n’appellera que y.bar() si x.foo() true . Inversement,

 x.foo() || y.bar() 

n’appellera que y.bar() si x.foo() false .

 (x && y) 

est paresseux. Il évaluera seulement y si x est vrai.

 (x & y) 

n’est pas paresseux. y sera toujours évalué.

Réponse mise à jour – mon original était trompeur et incomplet.

Je dois d’abord m’excuser pour beaucoup de mes commentaires et réponses à cette question.

Après avoir lu la spécification, la distinction entre opérateurs binarys et conditionnels est beaucoup moins nette.

Selon l’article 14.10 de l’ECMA-334 :

Le &, ^, et | les opérateurs sont appelés les opérateurs logiques.

pour les opérations sur les entiers:

1 L’opérateur & calcule le bit logique ET des deux opérandes, le | L’opérateur calcule le OU logique au niveau des bits des deux opérandes et l’opérateur ^ calcule le OU exclusif logique au niveau des bits des deux opérandes. 2 Aucun débordement n’est possible à partir de ces opérations.

Selon l’article 14.11:

Le && et || les opérateurs sont appelés opérateurs logiques conditionnels. 2 On les appelle aussi les opérateurs logiques “en court-circuit”.

14.11.1

1 Lorsque les opérandes de && ou || sont de type bool, ou lorsque les opérandes sont de types ne définissant pas un opérateur & ou opérateur applicable, mais définissent des conversions implicites à bool, l’opération est traitée comme suit: 2 L’opération x && y est évaluée en tant que x? y: faux. 3 En d’autres termes, x est d’abord évalué et converti en type bool. 4 Alors, si x est vrai, y est évalué et converti en type bool, et cela devient le résultat de l’opération. 5 Sinon, le résultat de l’opération est faux. 6 L’opération x || y est évalué comme x? vrai: y. 7 En d’autres termes, x est d’abord évalué et converti en type bool. 8 Alors, si x est vrai, le résultat de l’opération est vrai. 9 Sinon, y est évalué et converti en type bool, et cela devient le résultat de l’opération.

14.11.2

1 Lorsque les opérandes de && ou || sont des types qui déclarent un opérateur & ou opérateur | défini par l’utilisateur applicable, les deux éléments suivants doivent être vrais, où T est le type dans lequel l’opérateur sélectionné est déclaré: 2 Le type de retour et le type de chaque paramètre de l’opérateur sélectionné l’opérateur doit être T. Autrement dit, l’opérateur doit calculer le ET logique ou le OU logique de deux opérandes de type T, et doit renvoyer un résultat de type T. 4 T doit contenir des déclarations d’opérateur true et operator false. Paragraphe 2 1 Une erreur de compilation se produit si l’une de ces conditions n’est pas remplie. 2 Sinon, le && ou || l’opération est évaluée en combinant l’opérateur true ou operator false défini par l’utilisateur avec l’opérateur défini par l’utilisateur sélectionné: 3 L’opération x && y est évaluée comme T.false (x)? x: T. & (x, y), où T.false (x) est une invocation de l’opérateur false déclarée dans T, et T. & (x, y) est une invocation de l’opérateur sélectionné. 4 En d’autres termes, x est d’abord évalué et l’opérateur false est invoqué sur le résultat pour déterminer si x est définitivement faux. 5 Alors, si x est définitivement faux, le résultat de l’opération est la valeur précédemment calculée pour x. 6 Sinon, y est évalué et l’opérateur sélectionné & est appelé sur la valeur calculée précédemment pour x et la valeur calculée pour y pour produire le résultat de l’opération. 7 L’opération x || y est évalué comme T.true (x)? x: T. | (x, y), où T.true (x) est une invocation de l’opérateur true déclaré dans T, et que T. | (x, y) est une invocation de l’opérateur sélectionné |. 8 En d’autres termes, x est d’abord évalué et l’opérateur true est invoqué sur le résultat pour déterminer si x est vraiment vrai. 9 Alors, si x est définitivement vrai, le résultat de l’opération est la valeur précédemment calculée pour x. 10 Sinon, y est évalué et l’opérateur sélectionné | est invoqué sur la valeur précédemment calculée pour x et la valeur calculée pour y pour produire le résultat de l’opération. Paragraphe 3 1 Dans l’une ou l’autre de ces opérations, l’expression donnée par x n’est évaluée qu’une seule fois, et l’expression donnée par y n’est pas évaluée ou évaluée exactement une fois. Paragraphe 4 1 Pour un exemple de type qui implémente les opérateurs true et operator false, voir §18.4.2.