Namensräume
Varianten
Aktionen

Alternative operator representations

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

C++ (und C) Quellcode kann in jedem nicht-ASCII 7-Bit-Zeichensatz geschrieben werden, der den ISO 646:1983 invarianten Zeichensatz enthält. Jedoch erfordern mehrere C++ Operatoren und Satzzeichen Zeichen, die außerhalb des ISO 646 Codesets liegen: {, }, [, ], #, \, ^, |, ~. Um Zeichensätze verwenden zu können, in denen einige oder alle dieser Symbole nicht existieren (wie z.B. das deutsche DIN 66003), definiert C++ die folgenden Alternativen, die aus ISO 646 kompatiblen Zeichen zusammengesetzt sind.

Inhalt

[edit] Alternative Tokens

Es gibt alternative Schreibweisen für mehrere Operatoren und andere Tokens, die nicht-ISO646 Zeichen verwenden. In jeder Hinsicht der Sprache verhält sich jedes alternative Token exakt gleich wie sein primäres Token, außer seiner Schreibweise (der Stringifizierungsoperator kann die Schreibweise sichtbar machen). Die zwei-Buchstaben-Alternativ-Tokens werden manchmal "Digraphen" genannt. Trotz ihrer vier Buchstabenlänge wird %:%: ebenfalls als Digraph betrachtet.

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

[edit] Trigraphen (entfernt in C++17)

Die folgenden Drei-Zeichen-Gruppen (Trigraphen) werden vor Kommentaren und String-Literalen erkannt, und jede Erscheinung eines Trigraphen wird durch das entsprechende primäre Zeichen ersetzt

Primär Trigraph
{ ??<
} ??>
[ ??(
] ??)
# ??=
\ ??/
^ ??'
| ??!
~ ??-

Da Trigraphen früh verarbeitet werden, wird ein Kommentar wie // Wird die nächste Zeile ausgeführt?????/ effektiv die folgende Zeile auskommentieren, und ein String-Literal wie "Datum eingeben ??/??/??" wird als "Datum eingeben \\??" geparst.

[edit] Notizen

Die Zeichen & und ! sind unter ISO-646 invariant, aber Alternativen werden für die Tokens, die diese Zeichen verwenden, trotzdem bereitgestellt, um noch restriktivere historische Zeichensätze zu berücksichtigen.

Es gibt keine alternative Schreibweise (wie z.B. eq) für den Gleichheitsoperator ==, da das Zeichen = in allen unterstützten Zeichensätzen vorhanden war.

[edit] Kompatibilität mit C

Die gleichen Wörter sind in der C-Programmiersprache in der Include-Datei <iso646.h> als Makros definiert. Da diese in C++ 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, dem # fehlt, unbrauchbar).

[edit] Schlüsselwörter

and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq

[edit] Beispiel

Das folgende Beispiel demonstriert die Verwendung mehrerer alternativer Tokens.

%:include <iostream>
 
struct X
<%
    compl X() <%%> // destructor
    X() <%%>
    X(const X bitand) = delete; // copy constructor
    // X(X and) = delete; // move constructor
 
    bool operator not_eq(const X bitand other)
    <%
       return this not_eq bitand other;
    %>
%>;
 
int main(int argc, char* argv<::>) 
<%
    // lambda with reference-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

[edit] Referenzen

  • C++23 Standard (ISO/IEC 14882:2024)
  • 5.5 Alternative Tokens [lex.digraph]
  • C++20 Standard (ISO/IEC 14882:2020)
  • 5.5 Alternative Tokens [lex.digraph]
  • C++17 Standard (ISO/IEC 14882:2017)
  • 5.5 Alternative Tokens [lex.digraph]
  • C++14 Standard (ISO/IEC 14882:2014)
  • 2.4 Trigraph-Sequenzen [lex.trigraph]
  • 2.6 Alternative Tokens [lex.digraph]
  • C++11 Standard (ISO/IEC 14882:2011)
  • 2.4 Trigraph-Sequenzen [lex.trigraph]
  • 2.6 Alternative Tokens [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]

[edit] Siehe auch

C Dokumentation für Alternative Operatoren und Tokens