2009-02-17 13 views
33

Ich habe gerade diese nice piece von Reddit gelesen.Wann wurden die alternativen Token 'and' und 'oder' in C++ eingeführt?

Sie erwähnen and und or sein "Alternative Tokens" zu && und ||

ich davon bisher wirklich nicht bewusst war. Natürlich weiß jeder über die di-graphs and tri-graphs, aber and und or? Seit wann? Ist das eine neue Ergänzung des Standards?

Ich habe es nur mit Visual C++ 2008 überprüft und es scheint nicht zu erkennen, dass dies etwas anderes als ein Syntaxfehler ist. Was ist los?

+1

Ich mag, wie sieben Jahre später, noch keine der gegebenen Antworten tatsächlich diese Frage beantworten. lol –

+1

@LightnessRacesinOrbit manchmal denke ich, dass es nicht viel ausmacht, solange es Google-Suchen beantwortet ;-) –

+0

Ich habe jetzt eine Antwort hinzugefügt, die die Frage beantwortet! –

Antwort

22

MSVC unterstützt sie nur als Schlüsselwörter, wenn Sie die Option /Za zum Deaktivieren von Erweiterungen verwenden; Dies gilt ab mindestens VC7.1 (VS2003).

Sie können sie als Makros unterstützen, indem Sie einschließen.

Meine Vermutung ist, dass sie glauben, dass das Erstellen von Keywords standardmäßig zu viel vorhandenen Code bricht (und ich wäre nicht überrascht, wenn sie richtig sind).

Dies wurde in einer Frage vor ein paar Wochen irgendwo hier auf SO diskutiert, aber ich kann nicht SO Suche oder Google, um das verdammte Ding zu finden.

+2

Also Python ist 50x cool, weil Sie 'und' schreiben können, während C dies als Feature die ganze Zeit hatte. – bobobobo

+0

@bobobobo Es scheint ein bisschen frustrierend, dass wir # 'überall dort, wo wir diese Schlüsselwörter in Visual Studio verwenden möchten, enthalten. Es ist wahrscheinlich keine Überraschung, dass g ++ sie aus dem Kasten unterstützt, da sie im Standard sind. –

+1

Ich fand diesen Link, der relevant erschien. Bug Beschreibung "Visual C++ 2012 Compiler und iso646.h entspricht nicht dem C++ 11 Standard in Bezug auf die Verwendung von alternativen Token für logische Operatoren" Status Geschlossen als Deferred. https://connect.microsoft.com/VisualStudio/feedback/details/751912/alternative-token-for-logical-operators-c-11 – Ted

0

Sie werden überrascht sein über den Rest von ihnen zu lernen: von C++ Keywords

and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq 

Liste.

Ich glaube, dass aktuelle Versionen von GCC diese Schlüsselwörter unterstützen.

+0

Ich würde sie kaum als neu bezeichnen. Sie sind im ursprünglichen C++ - Standard, nicht wahr? –

+0

Ok, sie sind älter als ein Jahrzehnt, ich werde das Wort "neu" entfernen. :) –

-1

Sie sind in dem Arbeitspapier für den neuen C++ Standard, auf Seite 14: C++ Standard

+5

Sie sind seit 1998 im C++ Standard. –

31

Aus dem C++ 11-Standard, 2.6/ Alternative tokens:

  1. Alternative Token Darstellungen sind für einige Betreiber zur Verfügung gestellt und Interpunktionszeichen.
  2. In jeder Hinsicht der Sprache, jedes alternative Token verhält sich jeweils dasselbe als sein primäres Token, mit Ausnahme seiner Schreibweise. Der Satz von alternativen Token ist in der Tabelle definiert 2.

Tabelle 2 - Alternative Token

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

Siehe C++ Standard. Der Entwurf des Ausschusses Nr. 2 ist frei verfügbar unter ftp://ftp.research.att.com/dist/c++std/WP/CD2/body.pdf, obwohl er nicht autoritativ, veraltet und an einigen Stellen teilweise falsch ist. Insbesondere in Abschnitt 2.5, Alternative Tokens, sind die folgenden definiert:

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

Obwohl ehrlich gesagt, habe ich noch nie mit Ausnahme and, einer von ihnen jemals or und not, und selbst dann, diejenigen verwendet gesehen sind selten. Beachten Sie, dass diese standardmäßig nicht in reinem C-Code zulässig sind, nur in C++. Wenn Sie sie in C verwenden möchten, haben Sie entweder #define sie sich als Makros oder #include der Header <iso646.h>, die mit Ausnahme alle oben definiert für <%>%<::>%:%:%: als Makros (Abschnitt 7.9 des C99 sehen Standard).

+2

Sie sind in C erlaubt, wenn Sie einschließen und seit 1994 gewesen sind. –

0

G ++ hat sie, aber ich weiß nicht über MS VC++.

Sie können die gleiche Funktionalität erhalten, indem Sie dies oben in Ihrer Codedatei einfügen.

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

Obwohl dies irgendwie hackish ist, sollte es funktionieren.

+1

Oder einschließen, wenn Ihre Implementierung es hat (denke ich die meisten). –

+4

Oder , wenn Sie C++ verwenden. –

10

Zur Beantwortung tatsächlich die Frage:

Sie in dem ersten C++ Standard definiert wurden.

0

Obwohl die Frage alt ist, würde ich es mit mehr oder weniger vollständiger Antwort liefern wollen: Alternative Tokens waren bereits ein Teil der derzeit zurückgezogen C++ 98 (ISO/IEC 14882:1998, die, glaube ich, war die erste ISO-Standard für C++). zwar keinen Beweis für sich (und ich habe kein Exemplar von ISO für C++ 98), here's a link - see C++ section.

Wie in den anderen Antworten erwähnt, MSVC Compiler [lex.digraph] Abschnitt verletzt der Standard, wenn /Za Flag ist nicht angegeben.