3.7 Boolescher Datentyp
Im C99-Standard wurde mit _Bool ein boolescher Wahrheitswert eingeführt, der auf jeden Fall groß genug ist, um die Werte 0 (= falsch) und 1 (= wahr) aufzunehmen. Der Datentyp _Bool gehört zur Gruppe der unsigned-Ganzzahltypen.
Glücklicherweise existiert für den Typ _Bool (ebenfalls seit C99) in der Header-Datei stdbool.h das Makro bool, sodass Sie den Bezeichner bool wie in C++ verwenden können. Allerdings müssen Sie hierfür die Header-Datei stdbool.h inkludieren. Manche fremden Programme – vor allem Downloads aus dem Internet – enthalten auch folgende Definition, anstatt die entsprechende Header-Datei einzufügen:
typedef enum {false,true} bool;
Ebenfalls häufig im Internet anzutreffen ist folgende, leider falsche Definition:
typedef enum {true,false} bool;
Bei der letzten Definition bilden Sie false auf 1 und true auf 0 ab, was in C zu schwer auffindbaren Fehlern führt. Hier verwechselt so mancher Programmierer bei der letzten (falschen) Definition C mit dem sehr viel älteren BASIC, wo in der Tat -1 (alle Bits sind gesetzt) als wahr und 0 (kein Bit ist gesetzt) als falsch angesehen wird. Gehen Sie daher auf Nummer sicher und verwenden Sie stdbool.h!
Der neue C23-Standard zählt allerdings mittlerweile sämtliche Variablen vom booleschen Typ zu den primitiven Datentypen und sieht die Datei stdbool.h nur noch als Option an. Wundern Sie sich also bitte nicht, wenn es in Zukunft immer mehr Compiler gibt, die stdbool.h entweder ignorieren oder sogar eine Meldung ausgeben, dass es die entsprechende Datei nicht gibt. Keine Panik: Ihre Programme laufen dann trotzdem noch, auch ohne stdbool.h.
Diese unbekannten oder ungewohnten Definitionen in fremden Programmen sind sehr verbreitet, vor allem auf Systemen mit wenig Speicher. Boolesche Werte sind Elemente einer »booleschen Algebra«, die einen von zwei möglichen Werten annehmen können. Dieses Wertepaar hängt von der Anwendung ab und lautet entweder wahr/falsch, true/false oder eben ungleich 0/gleich 0. In C kann hierfür das Wertepaar true (für wahr = 1) und false (für falsch = 0) verwendet werden, das in der Header-Datei stdbool.h definiert ist.
Sie können auch das Paar ungleich 0 (für wahr) und gleich 0 (für falsch) als Dezimalwert verwenden. Hierzu ein kleines Beispiel:
#include <stdbool.h>
// ...
// Schalter auf wahr setzen
_Bool b1 = 1;
// Schalter auf unwahr setzen
_Bool b2 = 0;
// Benötigt vor C23 <stdbool.h>
bool b3 = true; // wahr
// Benötigt vor C23 <stdbool.h>
bool b4 = false; // unwahr
Um hier kein Durcheinander zu verursachen, muss noch erwähnt werden, dass bereits der C-Standard seit C99 den Typ _Bool als echten Datentyp implementiert. Das Makro bool und das Wertepaar true bzw. false (kleingeschriebene Variante) können Sie aber nur verwenden, wenn Sie die Header-Datei stdbool.h inkludieren. Es ist auch hier leider nicht abzusehen, wie nach C23 in Zukunft mit stdbool.h verfahren wird und wie die Compiler-Hersteller dies sehen. Unter Linux benötigen Sie auf jeden Fall stdbool.h, weil dort zusätzlich zu C23 noch ein anderer Standard wichtig ist, nämlich der POSIX-Standard.