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

62

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

Je continuer à appeler &&, ||et les !opérateurs logiques, donc je me trompe?

John V
la source
4
Cela semble illogique, mais il existe une différence importante entre les deux classes et il est essentiel de ne pas supposer que, par exemple, il |est interchangeable avec ||, même si dans de nombreux cas, ils peuvent être interchangés sans changement apparent du comportement du programme.
Daniel R Hicks

Réponses:

120

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

Non; vous avez raison.

La documentation MSDN contient de nombreuses erreurs de nomenclature mineures, pour la plupart peu importantes. J'ai essayé d'en faire sortir le plus grand nombre 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 fonctionnalité C #.

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

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

Il poursuit ensuite en décomposant davantage les opérateurs logiques intégrés en opérateurs logiques entier, énumération, booléen et 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

Les opérateurs &&et ||sont appelés opérateurs logiques conditionnels. Ils sont également appelés opérateurs logiques «court-circuitant».

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 hypothèse spécieuse: c'est parce qu'elles sont généralement utilisées dans des instructions conditionnelles ( if) ou des expressions conditionnelles ( ? :). La vraie raison est donnée par le cahier des charges:

Les opérateurs &&et ||sont des versions conditionnelles des opérateurs &et |: L'opération x && ycorrespond à l'opération x & y, sauf qu'elle yn'est évaluée que si elle xn'est pas fausse. L'opération x || ycorrespond à l'opération x | y, sauf que yn'est évaluée que si xn'est pas vraie.

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

Nous pouvons le voir plus clairement en notant que les opérateurs logiques conditionnels ne sont que des "sucres syntaxiques" pour des expressions conditionnelles . x && yest tout simplement un moyen plus agréable d’écrire x ? y : falseet x || yun moyen plus agréable d’écrire x ? true : y. Les expressions logiques conditionnelles sont en réalité des expressions conditionnelles.

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

Lectures complémentaires, si ce sujet vous intéresse:

Eric Lippert
la source
3
@RobertHarvey: En effet, le fait que & puisse opérer sur des bools, des types entiers ou des types enum mais que && n'opère que sur des bools n'a rien à voir avec le choix de nommer l'un d'entre eux la forme "conditionnelle" de l'opérateur. L'opérateur conditionnel est conditionnel car il possède une branche conditionnelle dans sa sémantique d'évaluation.
Eric Lippert
16
J'ai l'impression que le terme "opérateur de court-circuit" est beaucoup plus populaire (et probablement moins ambigu) que "opérateur conditionnel" dans le sens décrit.
Doc Brown
15
@ DocBrown: C'est sûrement populaire, mais j'ai toujours trouvé ce nom trompeur; il semble avoir été inventé par quelqu'un qui pensait qu'un "court-circuit" et un "raccourci" pour obtenir un résultat sont la même chose. Un court-circuit est une faute dangereuse pouvant détruire rapidement un système électrique. Nous avons nommé les blocs "non sécurisés" en C # "non sécuritaires" car ils sont dangereux s'ils sont utilisés incorrectement ; ne donnons pas des choses mignonnes mais trompeuses aux noms chargés de valeurs. Ne me lance même pas sur l'opérateur Elvis. :-)
Eric Lippert
26
@ EricLippert: Bien que "court-circuit" puisse sembler effrayant au grand public, je ne pense pas que K & R ait été dérouté par la définition réelle. En génie électrique, la mise en court-circuit d’un circuit n’est pas toujours une faute dangereuse. En fait, nous le faisons intentionnellement tout le temps. Cela signifie simplement de couper une partie non désirée du circuit en donnant à l’électricité un chemin plus court à suivre.
hackerb9
1
@CortAmmon: Vous voudrez peut-être lire le paragraphe suivant dans lequel je signale que la sémantique de l'opérateur défini par l'utilisateur est légèrement différente et que vous devriez voir les spécifications pour plus de détails.
Eric Lippert
27

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

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

&&et ||sont appelés " opérateurs logiques conditionnels " parce qu'ils court-circuitent.

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 ne ||sont que des opérateurs logiques. En Java, &et |sont appelés Opérateurs de bits , tandis que C et C ++ les classe comme Opérateurs arithmétiques .

Robert Harvey
la source
3
Oui, Microsoft est l'autorité, mais le document faisant autorité est la spécification. Reportez-vous à la section 7.12, Opérateurs logiques conditionnels .
Eric Lippert
8
La morale de l'histoire étant la suivante: il est plus important de comprendre précisément ce que font ces opérateurs que de préciser leur nom.
Robert Harvey
21
Concentrez-vous sur ce que font les opérateurs et arrêtez de vous obséder du vocabulaire. Voir aussi Nommer considéré nocif .
Robert Harvey
4
+1 Tout ce qui est mentionné dans la question ne concerne que les opérateurs qui prennent une ou deux expressions et s’évaluent en une valeur. Les adjectifs sont inutiles couper les cheveux.
Blrfl
3
@RobertHarvey “Considéré nuisible” Essais
jugés
-2

Le fait est que &et |sont des opérateurs au niveau du bit , ce qui signifie qu’ils sont appliqués à des valeurs de chaîne de bits. Et bitwise est un terme très utilisé par les programmeurs.

Par exemple 0xff & 0x00 == 0x00, alors que 0xff | 0x00 == 0xff.

Et &&et ||sont appliqués aux conditions et donnent les valeurs habituelles des conditions; c'est à dire trueet false.

Par exemple true && false == false, alors que true || false == true.

Par conséquent &&, ils ||pourraient être appelés opérateurs conditionnels , même si ce n’est pas un terme courant chez les programmeurs.

Bien entendu, tous les programmeurs C, C ++, Java et C # savent tout cela. Mais je suppose que l'incompréhension survient parce que "opérateur conditionnel" n'est pas un terme fréquemment utilisé par nos programmeurs.

Hilton Fernandes
la source
5
Bien entendu, tous les programmeurs C, C ++, Java et C # savent tout cela. C'est une chose très grossière à écrire, ce qui implique que le PO est stupide. De même en nous écrivant des programmeurs , vous excluez le PO. S'il vous plaît ne faites pas ça.
DarkDust
1
Je ne pense pas que votre dernière réponse apporte une valeur ajoutée après la réponse acceptée par Eric Lippert, et est en outre incorrecte dans le sens de ne pas comprendre le sens de la question.
Honza Zidek
@DarkDust Tous les programmeurs C, C ++, Java et C # doivent comprendre ces opérateurs. Ce n'est pas grossier mais un fait .
Phil1970
1
@ Phil1970: OP semble comprendre ces opérateurs, il s'agit d'une clarification de la dénomination . Dans cette optique, et après avoir souligné les termes pertinents dans la réponse de Hilton, cette phrase peut être interprétée comme signifiant que tout programmeur connaît ces détails de dénomination, mais vous ne le savez pas . C'est faux (comme on le voit dans les discussions des autres réponses) et son phrasé est grossier.
DarkDust
4
Chers tous, je suis désolé si ma réponse semblait impolie. L'anglais n'est pas la 1ère langue. En tout cas, je n'ai jamais eu l'intention de laisser entendre que l'OP n'était pas un programmeur. Au contraire, je voulais dire qu'il était troublé par une désignation inhabituelle dans le texte qu'il lisait. Tout ce que j'ai essayé de faire était de clarifier la dénomination inhabituelle par fragments de programme.
Hilton Fernandes