2009-02-17 6 views
33

Ho appena letto questo nice piece da Reddit.Quando i token alternativi 'and' e 'or' sono stati introdotti in C++?

accennano and e or essere "Gettoni Alternative" per && e ||

ero davvero a conoscenza di questi fino ad ora. Naturalmente, tutti sanno dello di-graphs and tri-graphs, ma and e 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 sintassi. Cosa sta succedendo?

+1

Mi piace come sette anni dopo, ancora nessuna delle risposte fornite in realtà risponde a questa domanda. lol –

+1

@LightnessRacesinOrbit a volte penso che non importi molto, purché risponda alle ricerche di Google ;-) –

+0

Ho ora aggiunto una risposta che risponde alla domanda! –

risposta

22

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

È possibile ottenere supportati come macro includendo iso646.h.

Secondo la mia ipotesi, il fatto di renderli parole chiave predefinite interromperà il codice esistente troppo (e non sarei sorpreso se abbiano ragione).

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

+2

Quindi Python è cool 50x perché puoi scrivere 'and', nel frattempo C ha sempre avuto questa caratteristica. – bobobobo

+0

@bobobobo Sembra un po 'frustrante dover "#includere " ovunque vogliamo utilizzare queste parole chiave in Visual Studio. Probabilmente non c'è da sorprendersi che g ++ li supporti fuori dagli schemi poiché sono nello standard. –

+1

Ho trovato questo collegamento che sembrava pertinente. Descrizione del bug "Il compilatore Visual C++ 2012 e iso646.h non sono conformi allo standard C++ 11 per quanto riguarda l'uso di token alternativi per operatori logici". Stato Chiuso come Differito. https://connect.microsoft.com/VisualStudio/feedback/details/751912/alternative-tokens-for-logical-operators-c-11 – Ted

0

Si può essere sorpresi di conoscere il resto di loro:

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq 

List dal C++ Keywords.

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

+0

Non li definirei appena nuovi. Sono nello standard C++ originale, vero? –

+0

Ok, sono più vecchi di un decennio, rimuoverò la parola "nuovo". :) –

-1

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

+5

Sono stati nello standard C++ dal 1998. –

31

Dalla serie C++ 11, 2.6/ Alternative tokens:

  1. rappresentazioni simboliche alternativi sono previsti alcuni operatori e punteggiatori.
  2. In tutti gli aspetti del linguaggio, ogni token alternativo si comporta allo stesso modo, rispettivamente, come token principale, ad eccezione della sua ortografia. L'insieme di token alternativi è definita nella Tabella 2.

Tabella 2 - Alternativa gettoni

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

Vedere lo standard C++. La bozza del comitato n. 2 è disponibile gratuitamente allo ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf, sebbene non autorizzata, obsoleta e parzialmente errata in alcuni punti. In particolare, nella sezione 2.5, Gettoni alternativi, sono definiti i seguenti:

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

Anche se, onestamente, non ho mai visto nessuno di loro mai utilizzati a meno 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 si desidera utilizzarli in C, dovrete sia #define da soli come macro, o #include l'intestazione <iso646.h>, che definisce tutto quanto sopra tranne che per <%>%<::>%:%:%: come macro (vedere la sezione 7.9 della C99 standard).

+2

Sono consentiti in C se si include e sono stati dal 1994. –

0

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

È possibile ottenere la stessa funzionalità inserendo questo nella parte superiore del 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.

+1

o includere , se l'implementazione ce l'ha (credo che la maggior parte lo faccia). –

+4

Oppure se stai usando C++. –

10

Per rispondere in realtà la domanda:

Essi sono stati definiti nel primo standard C++.

0

Anche se la domanda è 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), here's a link - see C++ section.

Come accennato nelle altre risposte, MSVC compilatore sta violando [lex.digraph] sezione lo standard quando il flag /Za non è specificato.

Problemi correlati