Les versions écrites des opérateurs logiques

94

C'est le seul endroit que j'ai jamais vu and, oret notrépertorié comme des opérateurs réels en C ++. Quand j'ai écrit un programme de test dans NetBeans, j'ai mis le soulignement rouge comme s'il y avait une erreur de syntaxe et j'ai pensé que le site Web était erroné, mais c'est NetBeans qui est faux car il a été compilé et exécuté comme prévu.

Je peux voir !être favorisé par rapport à notmais la lisibilité de and&& orsemble plus grande que leurs frères grammaticaux. Pourquoi ces versions des opérateurs logiques existent-elles et pourquoi personne ne les utilise apparemment? Est-ce vraiment du C ++ valide ou une sorte de compatibilité avec C qui était incluse avec le langage?

défectueux
la source
4
\ me Réécrit tout son code
Expiation limitée
2
dans l'esprit du "code propre", je recommanderais personnellement de se débarrasser de l'habitude d'écrire ||et &&, peut-être même !parfois. Les mots sont toujours meilleurs que le "bruit de ligne", sans parler de la confusion possible avec les opérateurs de manipulation de bits.
Ichthyo
2
@Ichthyo Ce n'est pas toujours correct. Il est beaucoup plus rapide de lire beaucoup de symboles et d'en connaître la signification, que de lire beaucoup de mots.
vallentin
ce qui est plus clair pour un lecteur humain dépend de la «Gestalt». Parfois, un symbole peut être plus clair qu'un terme confus, mais dans ce cas, ce n'est pas le cas. Et, de simples mots de la langue anglaise sont bien plus universels que certains symboles spéciaux étranges d'un langage de programmation quelque peu étrange ...
Ichthyo
3
L'ironie de dire cela andest plus lisible, puis d'écrire " and&& or" si :)
Ivan Vergiliev

Réponses:

111

Ils proviennent de C dans l'en-tête <iso646.h>. À l'époque, il y avait des claviers qui ne pouvaient pas taper les symboles requis pour &&(par exemple), donc l'en-tête contenait #definedes éléments qui les aideraient à le faire, en définissant (dans notre exemple) andêtre &&. Bien sûr, avec le temps, cela est devenu moins utilisé.

En C ++, ils sont devenus ce que l'on appelle des jetons alternatifs . Vous n'avez pas besoin d 'inclure quoi que ce soit pour utiliser ces jetons dans un compilateur conforme (en tant que tel, la version C ++ de l' en - tête C,, <ciso646>est vide). Les jetons alternatifs sont comme les jetons ordinaires, sauf pour l'orthographe. Ainsi, lors de l'analyse, andc'est exactement la même chose que&& , c'est juste une manière différente d'orthographier la même chose.

Quant à leur utilisation: parce qu'elles sont rarement utilisées, leur utilisation est souvent plus surprenante et déroutante qu'utile. Je suis sûr que si c'était normal, ils seraient beaucoup plus faciles à lire, mais les gens y sont tellement habitués &&et ||tout le reste devient juste distrayant.

EDIT: J'ai vu une très légère augmentation de leur utilisation depuis que j'ai publié ceci, cependant. Je les évite toujours.

GManNickG
la source
L'interprétation de ces jetons alternatifs est-elle donc juste une fonctionnalité du compilateur ou est-elle dans la spécification C ++?
défectueux du
2
@Kavon: C'est spécifié dans la section 2.5 de la norme; c'est une caractéristique du langage.
GManNickG
15
Personnellement, je pense qu'ils sont bien meilleurs ... mais je suis biaisé par Python. Je ne sais pas pourquoi certaines personnes pensent que si ce n'est pas brouillé, ce n'est pas du code ...
Matthieu M.
Donc, ceux-ci ne sont pas valides en C sans inclure ce fichier d'en-tête? Je suis surpris que tout le monde ne les utilise pas; ils rendent Python tellement plus lisible.
endolith
1
Au moins Visual Studio 2015 CTP 6 n'aimait pas mon orou notsans inclure l'en-tête.
usr1234567
19

Ils existent pour la convivialité (prise en charge des caractères dans les saveurs de clavier / écran) et la lisibilité générale, mais il y a une autre raison qui est de nos jours plus prononcée. Presque aucune des réponses ici , ici , ou même la réponse principale iciénoncez la raison principale pour laquelle beaucoup d'entre nous préfèrent les versions de mots aux versions de symboles (et une des principales raisons pour lesquelles d'autres langues les utilisent): les bogues. Les différences entre les versions de mots sont très visibles. Les différences entre les versions de symboles le sont nettement moins, au point de séduire les bogues dans une mesure comparativement beaucoup plus grande: "x | y" n'est pas du tout "x || y", mais quand il est intégré dans une expression plus large, beaucoup d'entre nous manquez la différence. C'est similaire au mélange accidentel courant de l'opérateur d'affectation et d'égalité. Pour cette raison, je me suis sevré des versions de symboles (ce n'était pas facile) en faveur des versions de mots. Je préfère que quelqu'un fasse une double prise sur eux en raison de notre amour des vieilles choses plutôt que de tenter les insectes.

mr3
la source
4
Malheureusement, dans Visual Studio (à partir de VS2013), vous devez définir une option de compilateur spécifique ( /Za) afin de prendre en charge les mots-clés alternatifs (voir stackoverflow.com/a/555524/368896 ). Cela a vraisemblablement aussi d'autres impacts. Ainsi, dans Visual Studio, il n'est pas nécessairement sûr de suivre ce conseil.
Dan Nissenbaum
FWIW / - comme je place des espaces autour des opérateurs, x | yest suffisamment distinct visuellement (dans les polices à espacement fixe) de x || y, mais je trouve que le !in, par exemple, est if (!f(xyz) && ...plus facile à manquer que if (not f(xyz) && ....
Tony Delroy
@Tony D lorsque vous mettez des espaces autour des opérateurs, c'est votre convention privée et pas évidente pour le lecteur. Mais l'utilisation de mots en langage naturel comme and, oret notdans une expression booléenne, améliore en fait la lisibilité et met en évidence la distinction entre les manipulations de bits. Ainsi, à mon
humble avis,
@DanNissenbaum J'ai trouvé cette option sous le nom C / C ++> Langage> Désactiver les extensions de langage , il est donc relativement sûr de s'attendre à des effets secondaires;)
Wolf
6
Savez-vous combien de bogues Python ont été introduits parce que les mots andet les orbiais influencent la réflexion des gens sur la façon dont ils devraient fonctionner? Par exemple, if (a == b or c)au lieu de if (a == b || a == c)- quelque chose comme ça apparaît presque tous les jours ici chez StackOverflow. Les symboles abstraits qui sont déconnectés de la langue anglaise réduisent ces erreurs.
Mark Ransom
10

En C ++, ce sont de vrais mots clés. En C, ce sont des macros définies dans <iso646.h>. Voir http://web.archive.org/web/20120123073126/http://www.dinkumware.com/manuals/?manual=compleat&page=iso646.html .

Chris Jester-Young
la source
6
Techniquement, ce sont des jetons alternatifs, pas des mots clés. :)
GManNickG
2
@GMan: +1 Bel appel, cependant, la page Dinkumware les appelle des mots-clés, donc, je suppose qu'ils ne se soucient pas trop de la distinction.
Chris Jester-Young
Lien mis à jour: f3.tiera.ru/1/addesio/computer-science/C&C++
kevinarpe
Alors, MSVC les prend-il en charge par défaut en C ++ mais pas en C?
rwst
1
@rwst Je ne peux pas commenter spécifiquement MSVC, mais s'il implémente fidèlement les normes C ++ et C, ce sera effectivement le cas. Voir aussi: stackoverflow.com/questions/2376448/…
Chris Jester-Young
2

andet &&sont fonctionnellement identiques en C ++. Les opérateurs andet orsont vraiment C ++ valides et font partie du standard du langage.

Pour élaborer d'autres réponses avec un exemple concret, il y a une autre raison en plus juste « lisibilité » à préférer andplus &&. Épeler explicitement «et» lorsqu'un ET logique est ce que vous voulez dire élimine la possibilité de bogues subtils.

Considère ceci:

int x = 3;
int y = 4;

// Explicitly use "and"
if (x and y) {
    cout << "and: x and y are both non-zero values" << endl;
}

// Using "&&"
if (x && y) {
    cout << "&&: x and y are both non-zero values" << endl;
}

// Oops! I meant to type "&&"!
if (x & y) {
    cout << "&: x and y are both non-zero values" << endl;
}
else {
    cout << "How did I get here?" << endl;
}

Les trois instructions if seront compilées, mais la dernière signifie quelque chose de complètement différent et non intentionnel!

Si vous utilisez toujours andquand vous voulez dire ET logique, vous ne pouvez jamais taper accidentellement un seul "&" et faire compiler votre code avec succès et s'exécuter avec des résultats mystérieux.

Un autre bon exercice: essayez de laisser un caractère "et" par accident et voyez ce qui se passe. ;)

tjwrona1992
la source
1
Ce n'est pas vraiment une réponse à la question. C'est juste que vous dites que ce que vous ressentez est plus lisible. Le PO a demandé comment fonctionnent les versions écrites, pas celles qui sont meilleures. Et quelqu'un d'autre a déjà fait valoir le même argument que vous essayez de faire valoir.
Nicol Bolas
Non pas que cela fournisse vraiment des informations plus utiles mais j'ajouterai " andet &&sont fonctionnellement identiques" à la réponse ... Et si vous lisez ma réponse, vous verrez que je dis que ce
n'est