Vergleichsoperatoren
Vergleichsoperatoren sind binäre Operatoren, die eine Bedingung prüfen und 1 zurückgeben, wenn die Bedingung logisch wahr ist, und 0, wenn die Bedingung falsch 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 als oder gleich | a <= b | a ist kleiner als oder gleich b |
| >= | größer als oder gleich | a >= b | a ist größer als oder gleich b |
Inhalt |
[bearbeiten] Relationale Operatoren
Die Ausdrücke mit relationalen Operatoren haben die Form
lhs < rhs |
(1) | ||||||||
lhs > rhs |
(2) | ||||||||
lhs <= rhs |
(3) | ||||||||
lhs >= rhs |
(4) | ||||||||
wobei
| lhs, rhs | - | Ausdrücke, die beide einen realen Typ oder beide einen Zeigertyp auf ein Objekt haben |
Der Typ jedes Ausdrucks mit einem relationalen Operator ist int, und sein Wert (der kein lvalue ist) ist 1, wenn die angegebene Beziehung wahr ist, und 0, wenn die angegebene Beziehung nicht wahr ist.
Wenn lhs und rhs Ausdrücke eines beliebigen realen Typs sind, dann
- übliche arithmetische Umwandlungen werden durchgeführt
- die Werte der Operanden nach der Umwandlung werden im üblichen mathematischen Sinne verglichen (außer dass positive und negative Nullen gleich sind und jeder Vergleich, der einen NaN-Wert beinhaltet, Null zurückgibt)
Beachten Sie, dass komplexe und imaginäre Zahlen mit diesen Operatoren nicht verglichen werden können.
Wenn lhs und rhs Ausdrücke vom Zeigertyp sind, müssen sie beide Zeiger auf Objekte von kompatiblen Typen sein, wobei Qualifizierer der zeigenden 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 Ende desselben Arrays zeigen, vergleichen sie sich als gleich
- wenn zwei Zeiger auf verschiedene Elemente desselben Arrays zeigen, vergleicht sich der Zeiger, der auf das Element mit dem größeren Index zeigt, als größer.
- wenn ein Zeiger auf ein Element eines Arrays zeigt und der andere Zeiger auf das Ende desselben Arrays zeigt, vergleicht sich der Zeiger, der auf das Ende zeigt, als größer
- wenn die beiden Zeiger auf Mitglieder derselben Struktur zeigen, vergleicht sich der Zeiger auf das später in der Strukturdefinition deklarierte Mitglied als größer als der Zeiger auf das früher deklarierte Mitglied.
- Zeiger auf Mitglieder derselben Union vergleichen sich als gleich
- alle anderen Zeigervergleiche führen zu undefiniertem Verhalten
#include <assert.h> int main(void) { assert(1 < 2); assert(2+2 <= 4.0); // int converts to double, two 4.0's compare equal struct { int x,y; } s; assert(&s.x < &s.y); // struct members compare in order of declaration 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); // different values }
[bearbeiten] Gleichheitsoperatoren
Die Ausdrücke mit Gleichheitsoperatoren haben die Form
lhs == rhs |
(1) | ||||||||
lhs != rhs |
(2) | ||||||||
wobei
| lhs, rhs | - | Ausdrücke, die
|
Der Typ jedes Ausdrucks mit einem Gleichheitsoperator ist int, und sein Wert (der kein lvalue ist) ist 1, wenn die angegebene Beziehung wahr ist, und 0, wenn die angegebene Beziehung nicht wahr ist.
- Wenn beide Operanden arithmetische Typen haben, werden übliche arithmetische Umwandlungen durchgeführt und die resultierenden Werte im üblichen mathematischen Sinne verglichen (außer dass positive und negative Nullen gleich sind und jeder Vergleich, der einen NaN-Wert beinhaltet, einschließlich Gleichheit mit sich selbst, Null zurückgibt). Insbesondere sind Werte vom komplexen Typ gleich, wenn ihre Realteile gleich sind und ihre Imaginärteile gleich sind.
| (seit C23) |
- wenn ein Operand ein Zeiger ist und der andere eine Nullzeigerkonstante ist, wird die Nullzeigerkonstante zuerst in den Typ des Zeigers umgewandelt (was einen Nullzeigerwert ergibt) und die beiden Zeiger werden wie unten beschrieben verglichen
- wenn ein Operand ein Zeiger ist und der andere ein Zeiger auf void ist, wird der Nicht-Void-Zeiger in den Zeiger auf void umgewandelt und die beiden Zeiger werden wie unten beschrieben verglichen
- zwei Zeiger vergleichen sich als gleich, wenn eine der folgenden Bedingungen zutrifft
- sie sind beide Nullzeigerwerte ihres Typs
- sie sind beide Zeiger auf dasselbe Objekt oder dieselbe Funktion
- ein Zeiger ist auf ein Struktur-/Union-/Array-Objekt und der andere auf dessen erstes Mitglied/irgendein Mitglied/erstes Element
- sie zeigen beide auf das Element nach dem letzten Element desselben Arrays
- einer zeigt auf das Ende eines Arrays und der andere auf den Anfang eines anderen Arrays (desselben Typs), das dem ersten in einem größeren Array oder in einer Struktur ohne Auffüllung folgt
(wie bei relationalen Operatoren verhalten sich Zeiger auf Objekte, die nicht zu einem Array gehören, wie Zeiger auf Elemente von Arrays der Größe 1)
[bearbeiten] Hinweise
Objekte vom Strukturtyp vergleichen sich nicht automatisch als gleich, und ihr Vergleich mit memcmp ist nicht zuverlässig, da die Auffüllbytes beliebige Werte haben können.
Da der Zeigervergleich mit Zeigern auf void funktioniert, kann das Makro NULL in C als (void*)0 definiert sein, obwohl dies in C++ ungültig wäre, wo void-Zeiger nicht implizit in typisierte Zeiger umgewandelt werden.
Beim Vergleichen von Gleitkommawerten 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 verglichen, wobei die Differenz von einer oder mehreren Stellen der letzten Stelle zugelassen wird.
#include <assert.h> int main(void) { assert(2+2 == 4.0); // int converts to double, two 4.0's compare equal int n[2][3] = {1,2,3,4,5,6}; int* p1 = &n[0][2]; // last element in the first row int* p2 = &n[1][0]; // start of second row assert(p1+1 == p2); // compare equal double d = 0.0/0.0; // NaN assert( d != d ); // NaN does not equal itself float f = 0.1; // f = 0.100000001490116119384765625 double g = 0.1; // g = 0.1000000000000000055511151231257827021181583404541015625 assert(f != g); // different values }
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 6.5.8 Relationale Operatoren (S. 68-69)
- 6.5.9 Gleichheitsoperatoren (S. 69-70)
- C11-Standard (ISO/IEC 9899:2011)
- 6.5.8 Relationale Operatoren (S. 95-96)
- 6.5.9 Gleichheitsoperatoren (S. 96-97)
- C99-Standard (ISO/IEC 9899:1999)
- 6.5.8 Relationale Operatoren (S. 85-86)
- 6.5.9 Gleichheitsoperatoren (S. 86-87)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 3.3.8 Relationale Operatoren
- 3.3.9 Gleichheitsoperatoren
[bearbeiten] Siehe auch
| Häufige Operatoren | ||||||
|---|---|---|---|---|---|---|
| Zuweisung | Inkrement Dekrement |
Arithmetik | Logisch | Vergleich | Member Zugriff |
Sonstiges |
|
a = b |
++a |
+a |
!a |
a == b |
a[b] |
a(...) |
| C++ Dokumentation für Vergleichsoperatoren
|