Namespaces
Variants

Alternative operator representations

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

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