Quand les jetons alternatifs « et » et « ou » ont-ils été introduits en C++ ?
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?
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
:
- représentations de jeton alternatives sont prévues pour certains opérateurs et ponctuation.
- 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