Namespaces
Variants

Comparison operators

From cppreference.net

Vergleichsoperatoren sind binäre Operatoren, die eine Bedingung prüfen und 1 zurückgeben, wenn diese Bedingung logisch true ist, und 0 , wenn diese Bedingung false ist.

Operator Operatorname Beispiel Beschreibung
== gleich a == b a ist gleich b
! = ungleich a ! = b a ist ungleich b
< kleiner als a < b a ist kleiner als b
> größer als a > b a ist größer als b
<= kleiner oder gleich a <= b a ist kleiner oder gleich b
>= größer oder gleich a >= b a ist größer oder gleich b

Inhaltsverzeichnis

Relationale Operatoren

Die relationalen Operatorausdrücke haben die Form

lhs < rhs (1)
lhs > rhs (2)
lhs <= rhs (3)
lhs >= rhs (4)
**Anmerkung:** Da der Text ausschließlich aus C++-spezifischen Begriffen (lhs, rhs) und HTML/Code-Elementen besteht, wurde gemäß den Übersetzungsanweisungen keine Übersetzung vorgenommen. Die numerischen Kennzeichnungen (1)-(4) bleiben ebenfalls unverändert, da sie Teil der technischen Dokumentationsstruktur sind.
1) Kleiner-als-Ausdruck
2) Größer-als-Ausdruck
3) kleiner-oder-gleich-Ausdruck
4) Größer-oder-Gleich-Ausdruck

wobei

lhs , rhs - Ausdrücke, die beide reellen Typ haben oder beide Zeiger-auf-Objekt-Typ haben

Der Typ jedes relationalen Operatorausdrucks ist int , und sein Wert (der kein Lvalue ist) ist 1 , wenn die spezifizierte Beziehung zutrifft, und 0 , wenn die spezifizierte Beziehung nicht zutrifft.

Wenn lhs und rhs Ausdrücke eines beliebigen Realtyps sind, dann

  • usual arithmetic conversions werden durchgeführt
  • die Werte der Operanden nach der Konvertierung werden im üblichen mathematischen Sinne verglichen (mit der Ausnahme, dass positive und negative Nullen als gleich betrachtet werden und jeder Vergleich mit einem NaN-Wert null zurückgibt)

Beachten Sie, dass komplexe und imaginäre Zahlen nicht mit diesen Operatoren verglichen werden können.

Wenn lhs und rhs Ausdrücke vom Zeigertyp sind, müssen beide Zeiger auf Objekte kompatibler Typen sein, wobei Qualifizierer der referenzierten Objekte ignoriert werden.

  • ein Zeiger auf ein Objekt, das kein Element eines Arrays ist, wird so behandelt, als würde er auf ein Element eines Arrays mit einem Element zeigen
  • wenn zwei Zeiger auf dasselbe Objekt zeigen oder beide auf das Element nach dem Ende desselben Arrays zeigen, sind sie im Vergleich gleich
  • wenn zwei Zeiger auf verschiedene Elemente desselben Arrays zeigen, ist derjenige größer, der auf das Element mit dem größeren Index zeigt
  • wenn ein Zeiger auf ein Element eines Arrays zeigt und der andere Zeiger auf das Element nach dem Ende desselben Arrays zeigt, ist der Zeiger auf das Element nach dem Ende größer
  • wenn die beiden Zeiger auf Mitglieder derselben struct zeigen, ist der Zeiger auf das später in der Struct-Definition deklarierte Mitglied größer als der Zeiger auf das früher deklarierte Mitglied
  • Zeiger auf Mitglieder derselben Union sind im Vergleich gleich
  • alle anderen Zeigervergleiche rufen undefiniertes Verhalten hervor
#include <assert.h>
int main(void)
{
    assert(1 < 2);
    assert(2+2 <= 4.0); // int konvertiert zu double, zwei 4.0-Werte vergleichen gleich
    struct { int x,y; } s;
    assert(&s.x < &s.y); // Struct-Member werden in Deklarationsreihenfolge verglichen
    double d = 0.0/0.0; // NaN
    assert( !(d < d) );
    assert( !(d > d) );
    assert( !(d <= d) );
    assert( !(d >= d) );
    assert( !(d == d) );
    float f = 0.1; // f = 0.100000001490116119384765625
    double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625
    assert(f > g); // unterschiedliche Werte
}

Gleichheitsoperatoren

Die Gleichheitsoperator-Ausdrücke haben die Form

lhs == rhs (1)
lhs != rhs (2)
1) Equal-to-Ausdruck
2) Ungleich-Ausdruck

wobei

lhs , rhs - Ausdrücke, die
(seit C23)
  • beide Zeiger auf Objekte oder Funktionen von kompatiblen Typen sind, unter Ignorierung von Qualifizierern der Zieltypen
  • einer ein Zeiger auf ein Objekt und der andere ein Zeiger auf (möglicherweise qualifiziertes) void ist
  • einer ein Zeiger auf ein Objekt oder eine Funktion und der andere eine Nullzeiger-Konstante wie NULL oder nullptr (seit C23) ist

Der Typ eines jeden Gleichheitsoperator-Ausdrucks ist int , und sein Wert (der kein Lvalue ist) ist 1 , wenn die spezifizierte Beziehung zutrifft, und 0 , wenn die spezifizierte Beziehung nicht zutrifft.

  • wenn beide Operanden arithmetische Typen haben, übliche arithmetische Konvertierungen durchgeführt werden und die resultierenden Werte im üblichen mathematischen Sinne verglichen werden (mit der Ausnahme, dass positive und negative Nullen als gleich betrachtet werden und jeder Vergleich, der einen NaN-Wert beinhaltet, einschließlich des Gleichheitsvergleichs mit sich selbst, Null zurückgibt). Insbesondere sind Werte komplexen Typs gleich, wenn ihre Realteile als gleich verglichen werden und ihre Imaginärteile als gleich verglichen werden.
(seit C23)
  • wenn ein Operand ein Zeiger ist und der andere ein Nullzeiger-Konstant, wird der Nullzeiger-Konstant zuerst konvertiert in den Typ des Zeigers (was einen Nullzeiger-Wert ergibt), und die beiden Zeiger werden wie unten beschrieben verglichen
  • wenn ein Operand ein Zeiger ist und der andere ein Zeiger auf void, wird der nicht-void Zeiger konvertiert in den Zeiger auf void und die beiden Zeiger werden wie unten beschrieben verglichen
  • zwei Zeiger vergleichen gleich, wenn eine der folgenden Bedingungen zutrifft:
  • sie sind beide Nullzeigerwerte ihres Typs
  • sie zeigen beide auf dasselbe Objekt oder dieselbe Funktion
  • ein Zeiger zeigt auf ein Struct/Union/Array-Objekt und der andere auf sein erstes Mitglied/jedes Mitglied/erstes Element
  • sie zeigen beide auf das Element nach dem letzten Element desselben Arrays
  • einer zeigt auf das Element nach dem Ende eines Arrays und der andere auf den Anfang eines anderen Arrays (desselben Typs), das dem ersten in einem größeren Array oder in einem Struct ohne Padding folgt

(wie bei relationalen Operatoren verhalten sich Zeiger auf Objekte, die keine Elemente eines Arrays sind, wie Zeiger auf Elemente von Arrays der Größe 1)

Hinweise

Objekte vom Strukturtyp werden nicht automatisch als gleich verglichen, und der Vergleich mit memcmp ist nicht zuverlässig, da die Padding-Bytes beliebige Werte haben können.

Da Zeigervergleiche mit Zeigern auf void funktionieren, kann das Makro NULL in C als ( void * ) 0 definiert werden, obwohl dies in C++ ungültig wäre, da void-Zeiger sich dort nicht implizit in typisierte Zeiger umwandeln lassen.

Bei Gleitkommawertvergleichen auf Gleichheit ist Vorsicht geboten, da die Ergebnisse vieler Operationen nicht exakt dargestellt werden können und gerundet werden müssen. In der Praxis werden Gleitkommazahlen normalerweise mit einer Toleranz von einer oder mehreren Einheiten der letzten Stelle verglichen.

#include <assert.h>
int main(void)
{
    assert(2+2 == 4.0); // int konvertiert zu double, zwei 4.0-Werte vergleichen gleich
    int n[2][3] = {1,2,3,4,5,6};
    int* p1 = &n[0][2]; // letztes Element in der ersten Zeile
    int* p2 = &n[1][0]; // Anfang der zweiten Zeile
    assert(p1+1 == p2); // vergleichen gleich
    double d = 0.0/0.0; // NaN
    assert( d != d ); // NaN ist nicht gleich sich selbst
    float f = 0.1; // f = 0.100000001490116119384765625
    double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625
    assert(f != g); // unterschiedliche Werte
}

Referenzen

  • C17-Standard (ISO/IEC 9899:2018):
  • 6.5.8 Relational operators (S. 68-69)
  • 6.5.9 Equality operators (S. 69-70)
  • C11-Standard (ISO/IEC 9899:2011):
  • 6.5.8 Relational operators (S. 95-96)
  • 6.5.9 Equality operators (S. 96-97)
  • C99-Standard (ISO/IEC 9899:1999):
  • 6.5.8 Relationsoperatoren (S. 85-86)
  • 6.5.9 Gleichheitsoperatoren (S. 86-87)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 3.3.8 Relationsoperatoren
  • 3.3.9 Gleichheitsoperatoren

Siehe auch

Operator-Präzedenz

Häufige Operatoren
Zuweisung Inkrement
Dekrement
Arithmetisch Logisch Vergleich Mitgliederzugriff Sonstige

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 - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(seit C11)
(bis C23)

alignof
(seit C23)

C++ Dokumentation für Vergleichsoperatoren