Alternative operator representations
C++ (und C) Quellcode kann in jedem nicht-ASCII 7-Bit-Zeichensatz geschrieben werden, der den
ISO 646:1983
invarianten Zeichensatz enthält. Allerdings erfordern mehrere C++ Operatoren und Interpunktionszeichen Zeichen, die außerhalb des ISO 646-Codesatzes liegen:
{, }, [, ], #, \, ^, |, ~
. Um Zeichenkodierungen verwenden zu können, in denen einige oder alle dieser Symbole nicht vorhanden sind (wie das deutsche
DIN 66003
), definiert C++ die folgenden Alternativen, die aus ISO 646-kompatiblen Zeichen bestehen.
Inhaltsverzeichnis |
Alternative Token
Es gibt alternative Schreibweisen für mehrere Operatoren und andere Token, die Nicht-ISO646-Zeichen verwenden. In allen Aspekten der Sprache verhält sich jedes alternative Token genau gleich wie sein primäres Token, außer in seiner Schreibweise (der Stringifizierungsoperator kann die Schreibweise sichtbar machen). Die zweibuchstabigen alternativen Token werden manchmal "Digraphen" genannt. Obwohl es vier Buchstaben lang ist, wird % : % : ebenfalls als Digraph betrachtet.
| Primär | Alternative |
|---|---|
&&
|
and |
&=
|
and_eq |
&
|
bitand |
|
|
bitor |
~
|
compl |
!
|
not |
!=
|
not_eq |
||
|
or |
|=
|
or_eq |
^
|
xor |
^=
|
xor_eq |
{
|
<%
|
}
|
%>
|
[
|
<:
|
]
|
:>
|
#
|
%:
|
##
|
%:%:
|
Trigraphs (entfernt in C++17)
Die folgenden Dreiergruppen (Trigraphs) werden geparst, bevor Kommentare und Zeichenkettenliterale erkannt werden , und jedes Vorkommen eines Trigraphs wird durch das entsprechende Hauptzeichen ersetzt:
| Primär | Trigraf |
|---|---|
{
|
??<
|
}
|
??>
|
[
|
??(
|
]
|
??)
|
#
|
??=
|
\
|
??/
|
^
|
??'
|
|
|
??!
|
~
|
??-
|
Da Trigraphs früh verarbeitet werden, wird ein Kommentar wie // Will the next line be executed?????/ effektiv die folgende Zeile auskommentieren, und der String-Literal wie "Enter date ??/??/??" wird geparst als "Enter date \\ ??" .
Hinweise
Die Zeichen & und ! sind unter ISO-646 invariant, dennoch werden Alternativen für die Token bereitgestellt, die diese Zeichen verwenden, um noch restriktivere historische Zeichensätze zu berücksichtigen.
Es gibt keine alternative Schreibweise (wie eq ) für den Gleichheitsoperator == , da das Zeichen = in allen unterstützten Zeichensätzen vorhanden war.
Kompatibilität mit C
Dieselben Wörter sind in der Programmiersprache C in der Include-Datei <iso646.h> als Makros definiert. Da in C++ diese in die Sprache eingebaut sind, definiert die C++-Version von <iso646.h> sowie <ciso646> nichts. Die Nicht-Wort-Digraphen (z.B. < % ) sind jedoch Teil der Kernsprache und können ohne Einbindung eines Headers verwendet werden (andernfalls wären sie auf jedem Zeichensatz unbrauchbar, dem das # -Zeichen fehlt).
Schlüsselwörter
and , and_eq , bitand , bitor , compl , not , not_eq , or , or_eq , xor , xor_eq
Beispiel
Das folgende Beispiel demonstriert die Verwendung mehrerer alternativer Tokens.
%:include <iostream> struct X <% compl X() <%%> // Destruktor X() <%%> X(const X bitand) = delete; // Kopierkonstruktor // X(X and) = delete; // Move-Konstruktor bool operator not_eq(const X bitand other) <% return this not_eq bitand other; %> %>; int main(int argc, char* argv<::>) <% // Lambda mit Referenz-Capture: auto greet = <:bitand:>(const char* name) <% std::cout << "Hello " << name << " from " << argv<:0:> << '\n'; %>; if (argc > 1 and argv<:1:> not_eq nullptr) greet(argv<:1:>); else greet("Anon"); %>
Mögliche Ausgabe:
Hello Anon from ./a.out
Referenzen
- C++23-Standard (ISO/IEC 14882:2024):
-
- 5.5 Alternative Tokens [lex.digraph]
- C++20-Standard (ISO/IEC 14882:2020):
-
- 5.5 Alternative Token [lex.digraph]
- C++17-Standard (ISO/IEC 14882:2017):
-
- 5.5 Alternative Token [lex.digraph]
- C++14-Standard (ISO/IEC 14882:2014):
-
- 2.4 Trigraphen-Sequenzen [lex.trigraph]
-
- 2.6 Alternative Token [lex.digraph]
- C++11-Standard (ISO/IEC 14882:2011):
-
- 2.4 Trigraphen-Sequenzen [lex.trigraph]
-
- 2.6 Alternative Token [lex.digraph]
- C++03-Standard (ISO/IEC 14882:2003):
-
- 2.3 Trigraph-Sequenzen [lex.trigraph]
-
- 2.5 Alternative Tokens [lex.digraph]
- C++98 Standard (ISO/IEC 14882:1998):
-
- 2.3 Trigraph-Sequenzen [lex.trigraph]
-
- 2.5 Alternative Tokens [lex.digraph]
Siehe auch
|
C-Dokumentation
für
Alternative Operatoren und Tokens
|