Quelle est la différence entre logique et conditionnel et, ou en C#? [dupliquer]

possible Duplicate:

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

Logiques et ET OU:

(x & y)
(x | y)

conditionnel et et OR:

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

Je n'ai connu les opérandes conditionnelles que jusqu'à présent. Je sais ce qu'il fait et comment l'appliquer dans la si-états. Mais qu'est-ce que l' but des opérandes logiques?

40
demandé sur Community 2010-07-01 03:22:46

3 réponses

je préfère le voir comme" bitwise vs. conditional "plutôt que" logical vs. conditional "puisque le concept général de" logical " 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

par demande populaire, je dois également mentionner que les arguments sont évalués différemment. Au conditionnel version, si le résultat de l'ensemble de l'opération peut être déterminée par le premier argument, le deuxième argument n'est pas évaluer. C'est ce qu'on appelle l'évaluation en court-circuit. Les opérations Bitwise doivent évaluer les deux côtés pour calculer la valeur finale.

par exemple:

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

cela ne sera appelé y.bar() que si x.foo() est évalué à true . Inversement,

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

n'appellera y.bar() que si x.foo() est évalué à false .

68
répondu Cogwheel 2014-10-24 18:25:13
(x && y) 

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

(x & y)

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

31
répondu Robert Harvey 2010-06-30 23:25:37

mise à jour de la réponse - mon original était trompeur et incomplet.

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

après lecture de la spécification, la distinction entre opérateurs bitwise et conditionnel est beaucoup moins nette.

selon la section 14.10 de ECMA-334 :

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

pour les opérations entières:

1 l'opérateur & calcule le bitwise logique ET des deux opérandes, l' | l'opérateur calcule la logique bitwise OU des deux opérandes, et le ^ l'opérateur calcule la logique bitwise exclusifs OU des deux opérandes. 2 Pas de des débordements sont possibles à partir de ces opérations.

selon section 14.11:

les opérateurs & & et / / / sont appelés conditionnel opérateurs logiques. 2 Ils sont également appelés le "court-circuitage" opérateurs logiques.

14.11.1

1 lorsque les opérandes de & & ou / / sont le type bool, ou lorsque les opérandes sont de types qui ne définissent pas un l'exploitant et l'opérateur ou |, mais ne définir implicite conversions en bool, l'opération est traitée comme suit: 2 L'opération x && y est évaluée comme x ? y : c'est faux. 3 En d'autres termes, x est première évaluation et conversion au type bool. 4 Alors, si x est vrai, y est évalué et converti en alcool de type B, et cela devient le résultat du opération. 5 autrement, le résultat de l'opération est faux. 6 L' l'opération x / / y est évaluée comme x ? vrai: Y. 7 en d'autres termes, x est le premier évalué et converti en type bool. 8 alors, si x est vrai, le résultat de l'opération est vrai. 9 autrement, y est évalué et converti en type bool, et cela devient le résultat de opération.

14.11.2

1 lorsque les opérandes de & & ou / / sont types de déclarer applicable opérateur défini par l'utilisateur & ou opérateur |, les deux suivants doivent être vrais, où T est le type dans lequel le opérateur sélectionné est déclarée: 2 La le type de retour et le type de chaque paramètre de l'opérateur doit être T. 3 En d'autres termes, l' l'opérateur doit calculer la logique et ou la logique ou de deux opérandes de type T, et doit retourner un résultat de type T. 4 T doit contenir des déclarations de l'opérateur vrai et opérateur de faux. Paragraphe 2 1 A erreur de compilation se produit si l'une de ces exigences n'est pas satisfait. 2 dans le cas Contraire, l' && ou || opération est évaluée par combinant l'opérateur défini par l'utilisateur vrai ou opérateur faux avec l' opérateur sélectionné défini par l'utilisateur: 3 opération x && y est évaluée comme T. faux(x) ? x: T. & (x, y), où T. faux(x) est une invocation de la opérateur false déclaré en T, et T.&(x, y) est une invocation de la opérateur &. 4 En d'autres termes, x est d'abord évalué et opérateur le faux est appelée sur le résultat à déterminez si x est définitivement faux. Cinq Alors, si x est définitivement faux, le résultat de l'opération est la valeur précédemment calculées pour x. 6 Dans le cas contraire, y est évalué, et le opérateur sélectionné & est invoqué sur le valeur calculée antérieurement pour x et la valeur calculée pour y 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 la opérateur true déclaré en T, et T./ (x, y) est une invocation de la opérateur |. 8 En d'autres termes, x est d'abord évalué et l'opérateur vrai est invoqué sur le résultat pour déterminer si x est certainement vrai. 9 Ensuite, si x est certainement vrai, le résultat de l' l'opération est la valeur précédemment calculé pour X. 10 dans le cas contraire, y est évalué, et l'opérateur sélectionné | est invoquée sur la valeur précédemment calculé pour x et la valeur calculée pour y produire le résultat du opération. Le paragraphe 3 de 1 de ces opérations, l'expression donnée par x est évalué qu'une seule fois, et le l'expression donnée par y est pas évalué ou évalué exactement une fois. Le paragraphe 4 de l'1 Pour un exemple d'un type qui implémente l'opérateur vrai et opérateur false, voir §18.4.2.

11
répondu John Weldon 2010-07-01 00:06:29