Typ logiczny nazywa się bool (a nie, jak w Javie, boolean). Pamiątką z języka C (albo, sięgając jeszcze głębiej w historię, PL/I) jest, że rolę zmiennej typu bool może pełnić dowolna zmienna typu całkowitego lub wskaźnikowego, przy czym wartość 0 (dla wskaźników nullptr) jest równoważna false, a dowolna wartość niezerowa — true. Chociaż typ bool jest formalnie typem całkowitoliczbowym, nie ma czegoś takiego jak unsigned bool!
Na przykład wykonanie następującego fragmentu spowoduje, że zmienna k będzie miała wartość równą liczbie niezerowych elementów tablicy tab przed pierwszym elementem zerowym (jeśli wiadomo, że element zerowy tam w ogóle jest; w przeciwnym przypadku wynik byłby nieprzewidywalny, nie ma bowiem w C/C++ automatycznego sprawdzania przekroczenia zakresu indeksów tablicy!):
       int tab[] = { 2, -4, -3, 0, 3 }, k = -1;
       while ( tab[++k] );    // teraz k = 3
Dzieje się tak dlatego, że gdy wartość
k
 osiągnie 3,
odpowiedni element tablicy,
tab[3], będzie miał wartość
zerową, co zostanie zinterpretowane jako
false
 i zakończy
wykonywanie pętli
while. We wcześniejszych obrotach pętli
tab[i]
 przyjmuje różne wartości, ale wszystkie
są niezerowe, więc zostaną zinterpretowane jako
true.
W szczególności należy pamiętać, że prawdzie (true)
odpowiada dowolna wartość niezerowa, a nie tylko wartość 1, jak to
czasem jest błędnie sugerowane.
Do typu bool są też konwertowane wskaźniki — wartość pusta (NULL, a w nowym standardzie nullptr) jest interpretowana jako false, a każda inna jako true.
Literałami wartości typu bool są oczywiście false i true — są to słowa kluczowe języka i nie mogą być przedefiniowane.
Dodajmy, że w klasycznym C typ bool w ogóle nie istnieje — jego rolę pełnią wyłącznie typy całkowite lub wskaźnikowe.
T.R. Werner, 21 lutego 2016; 20:17