Question

je viens de lire ceci belle pièce de Reddit.

Ils mentionnent and et or étant des "jetons alternatifs" à && et ||

Je n'en étais vraiment pas au courant jusqu'à présent.Bien sûr, tout le monde connaît le di-graphes et tri-graphes, mais and et or?Depuis quand?Est-ce un ajout récent à la norme ?

Je viens de le vérifier avec Visual C++ 2008 et il ne semble pas les reconnaître comme autre chose qu'une erreur de syntaxe.Que se passe-t-il?

Était-ce utile?

La solution

MSVC les prend en charge comme mots-clés que si vous utilisez l'option /Za pour désactiver les extensions; ceci est vrai à partir d'au moins VC7.1 (VS2003).

Vous pouvez les obtenir pris en charge sous forme de macros en incluant iso646.h.

Je pense qu'ils croient que les mots-clés faisant par défaut briserait trop code existant (et je ne serais pas surpris s'ils ont raison).

Cela a été discuté dans une question il y a deux semaines, quelque part ici, mais je ne peux pas obtenir la recherche de SO ou Google pour trouver ce fichu truc.

Autres conseils

De la norme 11 C ++, 2.6/ Alternative tokens:

  1. représentations de jeton alternatives sont prévues pour certains opérateurs et ponctuation.
  2. Dans tous les aspects de la langue, chaque jeton alternatif se comporte, respectivement, comme son jeton principal, à l'exception de son orthographe. L'ensemble de jetons de substitution est défini dans le tableau 2.

Tableau 2 - jetons alternatifs

alternative primary | alternative primary | alternative primary
--------------------+---------------------+--------------------
   <%          {    |    and         &&   |    and_eq      &=
   %>          }    |    bitor       |    |    or_eq       |=
   <:          [    |    or          ||   |    xor_eq      ^=
   :>          ]    |    xor         ^    |    not         !
   %:          #    |    compl       ~    |    not_eq      !=
   %:%:        ##   |    bitand      &    |

Pour répondre effectivement à la question:

Ils ont été définis dans la première norme C ++.

Voir la norme C ++. Le projet de comité n ° 2 est disponible gratuitement à l'adresse ftp: //ftp.research.att .com / dist / c ++ std / WP / CD2 / body.pdf , bien qu'il soit non autoritaire, hors jour et partiellement incorrectes dans quelques endroits. Plus précisément, dans la section 2.5, Jetons alternatifs , les éléments suivants sont définis:

Alternative Primary
<%          {
%>          }
<:          [
:>          ]
%:          #
%:%:        ##
and         &&
bitor       |
or          ||
xor         ^
compl       ~
bitand      &
and_eq      &=
or_eq       |=
xor_eq      ^=
not         !
not_eq      !=

Bien honnêtement, je ne l'ai jamais vu aucun d'eux n'a jamais utilisé sauf pour and, or et not, et même alors, ceux-ci sont rares. Notez que ceux-ci ne sont pas admissibles par défaut dans le code C pur, uniquement en C ++. Si vous voulez les utiliser en C, vous devrez soit les #define-vous comme les macros, ou #include l'en-tête <iso646.h>, qui définit tous les ci-dessus, sauf pour <% >% <: :> %: %:%: sous forme de macros (voir la section 7.9 de la C99 standard).

Vous pourriez être surpris d'apprendre davantage sur le reste d'entre eux:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq

Liste de C ++ Mots-clés .

Je crois que les versions récentes de GCC prennent en charge ces mots-clés.

Bien que la question soit ancienne, j'aimerais y apporter une réponse plus ou moins complète :Les jetons alternatifs faisaient déjà partie du C++98 actuellement retiré (ISO/CEI 14882:1998, qui, je crois, fut la première norme ISO pour C++).Bien que ce ne soit pas une preuve en soi (et je ne possède pas de copie ISO pour c++98), voici un lien - voir la section C++.

Comme mentionné dans les autres réponses, le compilateur MSVC viole [lex.digraphe] section de la norme lorsque /Za le drapeau n’est pas spécifié.

Le compilateur GNU g ++ les a, mais je ne sais pas MS VC ++.

Vous pouvez obtenir les mêmes fonctionnalités en mettant ce en haut de votre fichier de code.

#define and &&
#define bitor |
#define or ||
#define xor ^
#define compl ~
#define bitand &
#define and_eq &=
#define or_eq ^=
#define xor_eq ^=
#define not !
#define not_eq !=

Bien que ce soit un peu hackish, il devrait fonctionner.

Ils sont dans le document de travail pour la nouvelle norme C ++, à la page 14: C ++ standard

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top