Namespaces
Variants

Logical operators

From cppreference.net

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

Operatorrangfolge

Häufige Operatoren
Zuweisung Inkrement
Dekrement
Arithmetik Logisch Vergleich Elementzugriff 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)

Siehe auch

C++-Dokumentation für Logische Operatoren