Namensräume
Varianten
Aktionen

Logische Operatoren

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
 
 

Gibt das Ergebnis einer booleschen Operation zurück.

Operatorname Syntax Über​lad​bar Prototyp-Beispiele (für class T)
Innerhalb der Klassendefinition Außerhalb der Klassendefinition
negation not a

!a

Ja bool T::operator!() const; bool operator!(const T &a);
AND a and b

a && b

Ja bool T::operator&&(const T2 &b) const; bool operator&&(const T &a, const T2 &b);
inklusive OR a or b

a || b

Ja bool T::operator||(const T2 &b) const; bool operator||(const T &a, const T2 &b);
Anmerkungen
  • Die schlüsselwortähnlichen Formen (and, or, not) und die symbolähnlichen Formen (&&, ||, !) können austauschbar verwendet werden (siehe alternative Darstellungen).
  • Alle integrierten Operatoren geben bool zurück, und die meisten benutzerdefinierten Überladungen geben ebenfalls bool zurück, sodass die benutzerdefinierten Operatoren auf dieselbe Weise wie die integrierten verwendet werden können. Bei einer benutzerdefinierten Operatorüberladung kann jedoch jeder Typ als Rückgabetyp verwendet werden (einschließlich void).
  • Integrierte Operatoren && und || führen eine Short-Circuit-Auswertung durch (operandieren den zweiten Operand nicht, wenn das Ergebnis nach der Auswertung des ersten bekannt ist), aber überladene Operatoren verhalten sich wie normale Funktionsaufrufe und werten immer beide Operanden aus.

Inhalt

[bearbeiten] Erklärung

Die logischen Operator-Ausdrücke haben die Form

! rhs (1)
lhs && rhs (2)
lhs || rhs (3)
1) Logisches NICHT
2) Logisches UND
3) Logisches inklusives ODER

Wenn der Operand kein bool ist, wird er in bool umgewandelt, indem kontextbezogene Umwandlung in bool verwendet wird: Dies ist nur gutartig, wenn die Deklaration bool t(arg) für ein erfundenes temporäres t gutartig ist.

Das Ergebnis ist ein bool Prvalue.

Für den integrierten logischen NICHT-Operator ist das Ergebnis true, wenn der Operand false ist. Andernfalls ist das Ergebnis false.

Für den integrierten logischen UND-Operator ist das Ergebnis true, wenn beide Operanden true sind. Andernfalls ist das Ergebnis false. Dieser Operator ist short-circuiting: Wenn der erste Operand false ist, wird der zweite Operand nicht ausgewertet.

Für den integrierten logischen ODER-Operator ist das Ergebnis true, wenn entweder der erste oder der zweite Operand (oder beide) true ist. Dieser Operator ist short-circuiting: Wenn der erste Operand true ist, wird der zweite Operand nicht ausgewertet.

Beachten Sie, dass bitwise logische Operatoren keine Short-Circuit-Auswertung durchführen.

[bearbeiten] Ergebnisse

a true false
!a false true
und a
true false
b true true false
false false false
or a
true false
b true true true
false true false

Bei der Auflösung von Aufrufen für überladene Operatoren nehmen die folgenden integrierten Funktionssignaturen an der Überladungsauflösung teil

bool operator!(bool)
bool operator&&(bool, bool)
bool operator||(bool, bool)

[bearbeiten] Beispiel

#include <iostream>
#include <sstream>
#include <string>
 
int main()
{
    int n = 2;
    int* p = &n;
    // pointers are convertible to bool
    if (    p && *p == 2  // "*p" is safe to use after "p &&"
        || !p &&  n != 2) // || has lower precedence than &&
        std::cout << "true\n";
 
    // streams are also convertible to bool
    std::stringstream cin;
    cin << "3...\n" << "2...\n" << "1...\n" << "quit";
    std::cout << "Enter 'quit' to quit.\n";
    for (std::string line;    std::cout << "> "
                           && std::getline(cin, line)
                           && line != "quit";)
        std::cout << line << '\n';
}

Ausgabe

true
Enter 'quit' to quit.
> 3...
> 2...
> 1...
>

[bearbeiten] Standardbibliothek

Da die Short-Circuit-Eigenschaften von operator&& und operator|| für Überladungen nicht gelten und boolesche Semantik besitzende Typen selten sind, überladen nur zwei Standardbibliotheksklassen diese Operatoren

wendet einen unären arithmetischen Operator auf jedes Element des Valarrays an
(öffentliche Memberfunktion von std::valarray<T>)
wendet binäre Operatoren auf jedes Element zweier Valarrays oder eines Valarrays und eines Werts an
(function template)
prüft, ob ein Fehler aufgetreten ist (Synonym für fail())
(public member function of std::basic_ios<CharT,Traits>) [bearbeiten]

[bearbeiten] Siehe auch

Operatorrangfolge

Operatorüberladung

Funktions-Objekt, das x && y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das x || y implementiert
(Klassen-Template) [bearbeiten]
Funktions-Objekt, das !x implementiert
(Klassen-Template) [bearbeiten]
Häufige Operatoren
Zuweisung Inkrement
Dekrement
Arithmetik Logisch Vergleich Member
Zugriff
Sonstiges

a = b
a += b
a -= b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b

++a
--a
a++
a--

+a
-a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

!a
a && b
a || b

a == b
a != b
a < b
a > b
a <= b
a >= b
a <=> b

a[...]
*a
&a
a->b
a.b
a->*b
a.*b

Funktionsaufruf

a(...)
Komma

a, b
Ternär

a ? b : c
Spezielle Operatoren

static_cast konvertiert einen Typ in einen anderen verwandten Typ
dynamic_cast konvertiert innerhalb von Vererbungshierarchien
const_cast fügt cv-Qualifizierer hinzu oder entfernt sie
reinterpret_cast konvertiert einen Typ in einen nicht verwandten Typ
C-Stil Cast konvertiert einen Typ in einen anderen durch eine Mischung aus static_cast, const_cast und reinterpret_cast
new erstellt Objekte mit dynamischer Speicherverwaltung
delete zerstört zuvor mit new-Ausdruck erstellte Objekte und gibt den zugewiesenen Speicherbereich frei
sizeof fragt die Größe eines Typs ab
sizeof... fragt die Größe eines packs ab (seit C++11)
typeid fragt die Typinformationen eines Typs ab
noexcept prüft, ob ein Ausdruck eine Ausnahme auslösen kann (seit C++11)
alignof fragt die Ausrichtungsvoraussetzungen eines Typs ab (seit C++11)

C-Dokumentation für Logische Operatoren