Logical operators
Logische Operatoren wenden Standard-Boolesche-Algebra-Operationen auf ihre Operanden an.
| Operator | Operatorname | Beispiel | Ergebnis |
|---|---|---|---|
| ! | logisches NICHT | ! a | die logische Negation von a |
| && | logisches UND | a && b | das logische UND von a und b |
| || | logisches ODER | a || b | das logische ODER von a und b |
Inhaltsverzeichnis |
Logisches NICHT
Der logische NOT-Ausdruck hat die Form
!
Ausdruck
|
|||||||||
wo
| expression | - | ein Ausdruck eines beliebigen skalaren Typs |
Der logische NOT-Operator hat den Typ int . Sein Wert ist 0 wenn expression zu einem Wert ausgewertet wird, der ungleich Null verglichen wird. Sein Wert ist 1 wenn expression zu einem Wert ausgewertet wird, der gleich Null verglichen wird. (daher ist ! E dasselbe wie ( 0 == E ) )
#include <stdbool.h> #include <stdio.h> #include <ctype.h> int main(void) { bool b = !(2+2 == 4); // nicht wahr printf("!(2+2==4) = %s\n", b ? "true" : "false"); int n = isspace('a'); // ungleich Null, falls 'a' ein Leerzeichen ist, sonst Null int x = !!n; // "Bang-Bang", gängiges C-Idiom zur Abbildung von Ganzzahlen auf [0,1] // (alle Werte ungleich Null werden zu 1) char *a[2] = {"non-space", "space"}; puts(a[x]); // x kann nun sicher als Index für ein Array mit 2 Zeichenketten verwendet werden }
Ausgabe:
!(2+2==4) = false non-space
Logisches UND
Der logische UND-Ausdruck hat die Form
lhs
&&
rhs
|
|||||||||
wo
| lhs | - | ein Ausdruck eines beliebigen skalaren Typs |
| rhs | - | ein Ausdruck eines beliebigen skalaren Typs, der nur ausgewertet wird, wenn lhs nicht gleich 0 verglichen wird |
Der logische-UND-Operator hat den Typ int und den Wert 1 wenn sowohl lhs als auch rhs ungleich Null verglichen werden. Er hat den Wert 0 andernfalls (wenn entweder lhs oder rhs oder beide gleich Null verglichen werden).
Es gibt einen Sequenzpunkt nach der Auswertung von lhs . Wenn das Ergebnis von lhs gleich Null verglichen wird, dann wird rhs überhaupt nicht ausgewertet (sogenannte Kurzschlussauswertung )
#include <stdbool.h> #include <stdio.h> int main(void) { bool b = 2+2==4 && 2*2==4; // b == true 1 > 2 && puts("this won't print"); char *p = "abc"; if(p && *p) // gängiges C-Idiom: wenn p nicht null ist // UND wenn p nicht auf das Ende der Zeichenkette zeigt { // (beachte, dass dank Kurzschlussauswertung dies // nicht versuchen wird, einen Nullzeiger zu dereferenzieren) // ... // ... dann führe einige Zeichenkettenverarbeitung durch } }
Logisches ODER
Der logische OR-Ausdruck hat die Form
lhs
||
rhs
|
|||||||||
wo
| lhs | - | ein Ausdruck eines beliebigen skalaren Typs |
| rhs | - | ein Ausdruck eines beliebigen skalaren Typs, der nur ausgewertet wird, wenn lhs gleich 0 verglichen wird |
Der logische-ODER-Operator hat den Typ int und den Wert 1 wenn entweder lhs oder rhs ungleich Null verglichen werden. Er hat den Wert 0 andernfalls (wenn sowohl lhs als auch rhs gleich Null verglichen werden).
Es gibt einen Sequenzpunkt nach der Auswertung von lhs . Wenn das Ergebnis von lhs ungleich Null verglichen wird, dann wird rhs überhaupt nicht ausgewertet (sogenannte Kurzschlussauswertung )
#include <stdbool.h> #include <stdio.h> #include <string.h> #include <errno.h> int main(void) { bool b = 2+2 == 4 || 2+2 == 5; // true printf("true or false = %s\n", b ? "true" : "false"); // logical OR can be used simialar to perl's "or die", as long as rhs has scalar type fopen("test.txt", "r") || printf("could not open test.txt: %s\n", strerror(errno)); }
Mögliche Ausgabe:
true or false = true could not open test.txt: No such file or directory
Referenzen
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.5.3.3 Unäre arithmetische Operatoren (S. 89)
-
- 6.5.13 Logischer UND-Operator (S. 99)
-
- 6.5.14 Logischer ODER-Operator (S. 99)
- C99-Standard (ISO/IEC 9899:1999):
-
- 6.5.3.3 Unäre arithmetische Operatoren (S. 79)
-
- 6.5.13 Logischer UND-Operator (S. 89)
-
- 6.5.14 Logischer ODER-Operator (S. 89)
- C89/C90-Standard (ISO/IEC 9899:1990):
-
- 3.3.3.3 Unäre arithmetische Operatoren
-
- 3.3.13 Logischer UND-Operator
-
- 3.3.14 Logischer ODER-Operator
Siehe auch
| Häufige Operatoren | ||||||
|---|---|---|---|---|---|---|
| Zuweisung |
Inkrement
Dekrement |
Arithmetik | Logisch | Vergleich | Elementzugriff | Sonstige |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
Siehe auch
|
C++-Dokumentation
für
Logische Operatoren
|