Der Nulldetektor in C
Der Nulldetektor »!« ist ein unärer Präfixoperator, welcher den Wert 0 erkennt.
#include <stdio.h> int main( void )
{ printf( "%d\n", ! 3 );
printf( "%d\n", ! 2 );
printf( "%d\n", ! 1 );
printf( "%d\n", ! 0 );
printf( "%d\n", !-1 );
printf( "%d\n", !-2 );
printf( "%d\n", !-3 ); }0
0
0
1
0
0
0#include <stdio.h> int main( void )
{ printf( "%d\n", ! 2.0 );
printf( "%d\n", ! 1.5 );
printf( "%d\n", ! 1.0 );
printf( "%d\n", ! 0.0 );
printf( "%d\n", !-1.0 );
printf( "%d\n", !-1.5 );
printf( "%d\n", !-2.0 ); }0
0
0
1
0
0
0
Der Wert 1 zeigt hier an, daß die Aussage „Der Operandenwert ist 0.“ wahr ist. Daher kann man das Ergebnis 1 auch als „wahr“ und das Ergebnis 0 auch als „falsch“ ansehen.
Schränkt man diesen Operator auf diese beiden Zahlen 0 und 1 ein, so macht er aus jeder dieser beiden Zahlen gerade die andere:
#include <stdio.h> int main( void )
{ printf( "%d\n", ! 1 );
printf( "%d\n", ! 0 ); }0
1
Auch ein Zeichenfolgenliteral kann als Operand verwendet werden.
#include <stdio.h>
int main( void )
{ printf( "%d\n", !'0' );
printf( "%d\n", !'A' ); }0
0
Wenn man weiterhin 0 als „falsch“ und 1 als „wahr“ ansieht, dann macht dieser Operator aus „wahr“ „falsch“ und aus „falsch“ „wahr“.
Will man diese Regel auch für die anderen Zahlen beibehalten, so muß man dann alle Zahlen außer 0 als „wahr“ ansehen, da ihre Verneinung ja „falsch“ ergibt.
Der Operand dieses Operators darf jeden der bisher vorgestellten Datentypen haben.
Eine Zeichenfolge gilt in diesem Sinne grundsätzlich als „wahr“ (ungleich 0).
#include <stdio.h>
int main( void )
{ printf( "%d\n", !"abc" );
printf( "%d\n", !"1" );
printf( "%d\n", !"0" );
printf( "%d\n", !"" ); }0
0
0
0
Dieser Operator illustriert eine allgemein Konvention der Programmiersprache C, derzufolge 0 auch als eine Repräsentation des Wahrheitswerts „falsch“ angesehen wird und jeder andere Wert den Wahrheitswert „wahr“ darstellen kann.
Boolean-Kontext
In C gibt es öfter Stellen, an denen es nur darum geht, ob ein Wert 0 oder nicht 0 ist. Solche Stellen bezeichnen wir auch als einen Boolean-Kontext.
- Anwendungsbeispiel für !
int isnotalpha( int const c ){ return !isalpha( c ); }
- Zeichen c ist kein Buchstabe
- Anwendungsbeispiel für !
int isalpha01( int const c ){ return !!isalpha( c ); }
- Zeichen c ist ein Buchstabe (Aussage hat nur 0 oder 1 als Wert)
Übungsfragen
Welche Werte haben die folgenden Ausdrücke?
!!0
!!1
!!2
!!""
Zitate *
The result of the logical negation operator ! is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has type int. N1570 6.5.3.3p5