C'est le seul endroit que j'ai jamais vu and
, or
et not
ré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 à not
mais la lisibilité de and
&& or
semble 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?
c++
language-features
logical-operators
défectueux
la source
la source
||
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.and
est plus lisible, puis d'écrire "and
&&or
" si :)Réponses:
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#define
des é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,and
c'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.
la source
or
ounot
sans inclure l'en-tête.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.
la source
/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.x | y
est suffisamment distinct visuellement (dans les polices à espacement fixe) dex || y
, mais je trouve que le!
in, par exemple, estif (!f(xyz) && ...
plus facile à manquer queif (not f(xyz) && ...
.and
,or
etnot
dans une expression booléenne, améliore en fait la lisibilité et met en évidence la distinction entre les manipulations de bits. Ainsi, à monand
et lesor
biais influencent la réflexion des gens sur la façon dont ils devraient fonctionner? Par exemple,if (a == b or c)
au lieu deif (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.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 .la source
and
et&&
sont fonctionnellement identiques en C ++. Les opérateursand
etor
sont 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
and
plus&&
. Épeler explicitement «et» lorsqu'un ET logique est ce que vous voulez dire élimine la possibilité de bogues subtils.Considère ceci:
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
and
quand 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. ;)
la source
and
et&&
sont fonctionnellement identiques" à la réponse ... Et si vous lisez ma réponse, vous verrez que je dis que ce