Namensräume
Varianten
Aktionen

Logische Operatoren

Von cppreference.com
< c‎ | Sprache

Logische Operatoren wenden standardmäßige 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

Inhalt

[bearbeiten] Logisches NICHT

Der logische NICHT-Ausdruck hat die Form

! Ausdruck

wobei

expression - ein Ausdruck eines beliebigen skalaren Typs

Der logische NICHT-Operator hat den Typ int. Sein Wert ist 0, wenn Ausdruck zu einem Wert ausgewertet wird, der ungleich Null ist. Sein Wert ist 1, wenn Ausdruck zu einem Wert ausgewertet wird, der gleich Null ist. (daher ist !E dasselbe wie (0==E))

#include <stdbool.h>
#include <stdio.h>
#include <ctype.h>
int main(void)
{
    bool b = !(2+2 == 4); // not true
    printf("!(2+2==4) = %s\n", b ? "true" : "false");
 
    int n = isspace('a'); // non-zero if 'a' is a space, zero otherwise
    int x = !!n; // "bang-bang", common C idiom for mapping integers to [0,1]
                 // (all non-zero values become 1)
    char *a[2] = {"non-space", "space"};
    puts(a[x]); // now x can be safely used as an index to array of 2 strings
}

Ausgabe

!(2+2==4) = false
non-space

[bearbeiten] Logisches UND

Der logische UND-Ausdruck hat die Form

lhs && rhs

wobei

lhs - ein Ausdruck eines beliebigen skalaren Typs
rhs - ein Ausdruck eines beliebigen skalaren Typs, der nur ausgewertet wird, wenn lhs nicht gleich 0 ist

Der logische UND-Operator hat den Typ int und den Wert 1, wenn sowohl lhs als auch rhs ungleich Null sind. Er hat den Wert 0 andernfalls (wenn entweder lhs oder rhs oder beide gleich Null sind).

Nach der Auswertung von lhs gibt es einen Sequenzpunkt. Wenn das Ergebnis von lhs gleich Null ist, wird rhs überhaupt nicht ausgewertet (sogenannte kurzgeschlossene Auswertung).

#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) // common C idiom: if p is not null
                // AND if p does not point at the end of the string
    {           // (note that thanks to short-circuit evaluation, this
                //  will not attempt to dereference a null pointer)
    // ...      // ... then do some string processing
    }
}

[bearbeiten] Logisches ODER

Der logische ODER-Ausdruck hat die Form

lhs || rhs

wobei

lhs - ein Ausdruck eines beliebigen skalaren Typs
rhs - ein Ausdruck eines beliebigen skalaren Typs, der nur ausgewertet wird, wenn lhs gleich 0 ist

Der logische ODER-Operator hat den Typ int und den Wert 1, wenn entweder lhs oder rhs ungleich Null ist. Er hat den Wert 0 andernfalls (wenn sowohl lhs als auch rhs gleich Null sind).

Nach der Auswertung von lhs gibt es einen Sequenzpunkt. Wenn das Ergebnis von lhs ungleich Null ist, wird rhs überhaupt nicht ausgewertet (sogenannte kurzgeschlossene Auswertung).

#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

[bearbeiten] 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

[bearbeiten] Siehe auch

Operatorrangfolge

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

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


_Alignof
(seit C11)
(bis C23)

alignof
(seit C23)

[bearbeiten] Siehe auch

C++ Dokumentation für Logische Operatoren