web-dev-qa-db-fra.com

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

Duplicata possible:
Quelle est la différence entre les opérateurs | et || ou?

ET logique et OU:

(x & y)
(x | y)

ET et OU conditionnels:

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

Je n'ai connu que les opérandes conditionnelles jusqu'à présent. Je sais ce qu'il fait et comment l'appliquer dans les instructions if. Mais à quoi servent les opérandes logiques?

47
Sahat Yalkabov

Je préfère le considérer comme "au niveau du bit vs conditionnel" plutôt que "logique vs conditionnel" car 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 dois é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 deuxième argument n'est pas évalué. C'est ce qu'on appelle l'évaluation des courts-circuits. Les opérations au niveau du bit doivent évaluer les deux côtés afin de calculer la valeur finale.

Par exemple:

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

Cela appellera uniquement y.bar() si x.foo() est évalué à true. Inversement,

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

appellera uniquement y.bar() si x.foo() est évalué à false.

77
Cogwheel
(x && y) 

est paresseux. Il n'évaluera y que si x est vrai.

(x & y)

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

33
Robert Harvey

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

Je dois d'abord m'excuser pour la plupart de mes commentaires et réponses à cette question.

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

Selon la section 14.10 de l'ECMA-334 :

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

pour les opérations entières:

1 L'opérateur & calcule le ET logique au niveau du bit des deux opérandes, le | L'opérateur calcule la logique OR logique des deux opérandes, et l'opérateur ^ calcule l'exclusivité logique OR des deux opérandes. 2 Aucun débordement n'est possible à partir de ces opérations.

Selon la section 14.11:

Les && et || les opérateurs sont appelés les opérateurs logiques conditionnels. 2 On les appelle également les opérateurs logiques de "court-circuitage".

14.11.1

1 Lorsque les opérandes de && ou || sont de type bool, ou lorsque les opérandes sont de types qui ne définissent pas un opérateur applicable & ou opérateur |, mais définissent des conversions implicites en bool, l'opération est traitée comme suit: 2 L'opération x && y est évaluée comme x? y: faux. 3 En d'autres termes, x est d'abord évalué et converti en type bool. 4 Ensuite, 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 Ensuite, 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 de types qui déclarent un opérateur défini par l'utilisateur applicable & ou un opérateur |, les deux conditions suivantes doivent être remplies, 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 du paramètre sélectionné L'opérateur doit être T. 3 En d'autres termes, l'opérateur doit calculer le ET logique ou le OR logique de deux opérandes de type T, et doit renvoyer un résultat de type T. 4 T doit contenir déclarations de l'opérateur vrai et de l'opérateur faux. Paragraphe 2 1 Une erreur de compilation se produit si l'une de ces conditions n'est pas remplie. 2 Sinon, l'opération && ou || est évaluée en combinant l'opérateur défini par l'utilisateur vrai ou l'opérateur faux avec le 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é en 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 re sult pour déterminer si x est définitivement faux. 5 Ensuite, 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 précédemment calculée 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 vrai déclaré dans T, et 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 définitivement vrai. 9 Ensuite, 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ée 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 l'opérateur true et l'opérateur false, voir le §18.4.2.

11
John Weldon