Quando sono stati introdotti i token alternativi “and” e “or” in C ++?

Ho appena letto questo bel pezzo di Reddit.

Menzionano ee or sono “token alternativi” per && e ||

Fino ad ora ero davvero all’oscuro di questi. Certamente, tutti conoscono le di-graph e i tricogrammi , ma and and or ? Da quando? Si tratta di una recente aggiunta allo standard?

Ho appena controllato con Visual C ++ 2008 e non sembra riconoscerli come qualcosa di diverso da un errore di syntax. Cosa sta succedendo?

MSVC li supporta come parole chiave solo se si utilizza l’opzione /Za per disabilitare le estensioni; questo è vero almeno da VC7.1 (VS2003).

Puoi ottenerli supportati come macro includendo iso646.h .

La mia ipotesi è che credano che renderli parole chiave di default infrangerebbero troppo il codice esistente (e non sarei sorpreso se loro avessero ragione).

Questo è stato discusso in una domanda un paio di settimane fa da qualche parte qui su SO, ma non posso ottenere la ricerca di SO o Google per trovare quella dannata cosa.

Dagli standard C ++ 11, 2.6/ Alternative tokens :

  1. Rappresentazioni alternative di token sono fornite per alcuni operatori e punteggiatori.
  2. Sotto tutti gli aspetti della lingua, ogni token alternativo si comporta allo stesso modo, rispettivamente, come il suo token principale, ad eccezione della sua ortografia. L’insieme di token alternativi è definito nella Tabella 2.

Tabella 2 – Token alternativi

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

Per rispondere effettivamente alla domanda:

Sono stati definiti nel primo standard C ++.

Vedi lo standard C ++. La bozza del comitato n. 2 è disponibile gratuitamente all’indirizzo ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf , sebbene non sia autorevole, obsoleto e parzialmente non corretto in alcuni punti. In particolare, nella sezione 2.5, token alternativi , sono definiti i seguenti:

 Primaria alternativa
 <% {
 %>}
 <: [: [
 :>]
 %: #
 %:%: ##
 e &&
 bitor |
 o ||
 xor ^
 compl ~
 bitand &
 and_eq & =
 or_eq | =
 xor_eq ^ =
 no!
 not_eq! =

Anche se onestamente, non ho mai visto nessuno di loro mai usato, tranne and , or , e not , e anche allora, quelli sono rari. Nota che questi NON sono permessi di default nel codice C semplice, solo in C ++. Se vuoi usarli in C, devi #include te stesso come macro, oppure #include l’intestazione , che definisce tutto quanto sopra tranne per <% >% <: :> %: %:%: come macro (vedere la sezione 7.9 dello standard C99).

G ++ li ha, ma non so su MS VC ++.

Puoi ottenere la stessa funzionalità inserendo questo nella parte superiore del tuo file di codice.

 #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 != 

Anche se questo è un po ‘hacker, dovrebbe funzionare.

Potresti essere sorpreso di conoscere il resto di loro:

 and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq 

Elenco da parole chiave C ++ .

Credo che le recenti versioni di GCC supportino queste parole chiave.

Sebbene la domanda sia vecchia, vorrei fornire una risposta più o meno completa: i token alternativi erano già una parte del C ++ 98 attualmente ritirato ( ISO / IEC 14882: 1998 , che, credo, era il primo ISO standard per C ++). Anche se non è una prova in sé (e non possiedo una copia di ISO per c ++ 98), ecco un link – vedi la sezione C ++.

Come menzionato nelle altre risposte, il compilatore MSVC sta violando la sezione [lex.digraph] dello standard quando non è specificato l’indicatore / Za .

Sono nel documento di lavoro per il nuovo standard C ++, a pagina 14: C ++ Standard