web-dev-qa-db-fra.com

&& et || ne sont pas des opérateurs logiques mais conditionnels?

Je suis un peu confus par la documentation MSDN C # qui indique que & et | sont des opérateurs logiques et que && et || sont des opérateurs conditionnels.

Je continue d'appeler &&, || et ! opérateurs logiques, donc je me trompe?

62
John V

Je suis un peu confus par la documentation MSDN C # qui indique que & et | sont des opérateurs logiques et que && et || sont des opérateurs conditionnels. Je continue d'appeler &&, || et ! opérateurs logiques, donc je me trompe?

Non; tu as raison.

Il existe de nombreuses petites erreurs de nomenclature, pour la plupart sans importance, dans la documentation MSDN; J'ai essayé d'en faire sortir autant que possible, mais dans les cas où ce n'est pas manifestement faux et trompeur, ce n'est pas toujours une utilisation judicieuse du temps. Accédez à la spécification si vous souhaitez une déclaration définitive sur le nom d'une fonction C #.

Donc: l'autorité compétente est la spécification C #, qui déclare dans la section 7.11:

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

Il continue ensuite à décomposer davantage les opérateurs logiques intégrés en opérateurs logiques d'entier, d'énumération, de booléen et de nullable-booléen. Il existe également des opérateurs logiques définis par l'utilisateur; voir les spécifications pour plus de détails.

Dans la section 7.12, nous avons

Le && et || les opérateurs sont appelés les opérateurs logiques conditionnels. Ils sont également appelés opérateurs logiques de "court-circuitage".

Tous sont donc des opérateurs logiques . Certains d'entre eux sont des opérateurs logiques conditionnels .

Qu'est-ce qui rend les opérateurs logiques conditionnels conditionnels ? On pourrait faire une supposition spécieuse que c'est parce qu'ils sont généralement utilisés dans les instructions conditionnelles (if) ou expressions conditionnelles (? :). La vraie raison est donnée par la spécification:

Le && et || les opérateurs sont des versions conditionnelles de & et | opérateurs: l'opération x && y correspond à l'opération x & y, sauf que y n'est évalué que si x n'est pas faux. L'opération x || y correspond à l'opération x | y, sauf que y n'est évalué que si x n'est pas vrai.

Les opérateurs logiques conditionnels sont ainsi nommés car l'opérande de droite est évalué conditionnellement en fonction de la valeur de l'opérande de gauche.

Nous pouvons voir cela plus clairement en notant que les opérateurs logiques conditionnels ne sont que des "sucres syntaxiques" pour les expressions conditionnelles . x && y est tout simplement une façon plus agréable d'écrire x ? y : false, et x || y est tout simplement une façon plus agréable d'écrire x ? true : y. Les expressions logiques conditionnelles sont en fait des expressions conditionnelles.

Il existe également une forme définie par l'utilisateur de l'opérateur logique conditionnel, et c'est un peu délicat. Voir la spécification pour plus de détails.

Pour en savoir plus, si ce sujet vous intéresse:

119
Eric Lippert

En C #, ce sont tous opérateurs logiques.

int x = 0xABCD & 0xFF // x == 0xCD

&& et || sont appelés " opérateurs logiques conditionnels " car ils sont court-circuités.

bool someOtherCondition = true;
if (x == 0xEF && someOtherCondition) // someOtherCondition is not evaluated, 
                                     // because x == 0xEF is false

Notez que cette terminologie diffère d'une langue à l'autre. En C et C++ && et || sont juste Opérateurs logiques. En Java, & et | sont appelés Opérateurs au niveau du bit , tandis que C et C++ les classent comme Opérateurs arithmétiques .

27
Robert Harvey