Concernant le type booléen en C
Un type booléen a été introduit assez tard dans le langage C, en l'an 1999. Avant, C n'ont pas de type booléen, mais plutôt utilisé int
pour l'ensemble des expressions booléennes. Par conséquent, tous les opérateurs logiques tels que > == !
etc retourner un int
de la valeur 1
ou 0
.
C'était la coutume pour les applications à utiliser à la maison-faites des types tels que typedef enum { FALSE, TRUE } BOOL;
, aussi, qui se résume à de la int
-taille des types.
C++ est beaucoup mieux, et explicite de type booléen, bool
, ce qui n'était pas plus grand que 1 octet. Alors que le booléen types ou des expressions en C constituerait 4 octets dans le pire des cas. D'une certaine manière, de la compatibilité avec le C++ a été introduit en C avec le standard C99. C puis a obtenu un type booléen _Bool
et aussi l'en-tête stdbool.h
.
stdbool.h
fournit une certaine compatibilité avec le C++. Cet en-tête définit la macro bool
(même orthographe que C++ mot-clé) qui s'étend à l' _Bool
, un type qui est un entier plus petit type, probablement 1 octet grand. De même, l'en-tête fournit deux macros true
et false
, même orthographe que C++ mots-clés, mais avec compatibilité descendante pour les plus âgés C programmes. Par conséquent, true
et false
étendre à d' 1
et 0
en C et leur type est int
. Ces macros ne sont pas réellement de type booléen comme le C++ correspondante mots clés serait.
De même, pour des raisons de compatibilité descendante, les opérateurs logiques en C encore retour une int
à ce jour, même si C de nos jours a un type booléen. Alors qu'en C++, les opérateurs logiques retour un bool
. Ainsi, une expression telle que sizeof(a == b)
donnera la taille d'un int
de C, mais de la taille d'un bool
en C++.
Quant à l'opérateur conditionnel ?:
L'opérateur conditionnel ?:
est bizarre opérateur avec un couple de bizarreries. C'est une erreur commune de croire que c'est 100% équivalent à if() { } else {}
. Pas tout à fait.
Il y a un point de séquence entre l'évaluation de la 1ère et de la 2ème ou 3ème d'opérande. L' ?:
de l'opérateur est garantie uniquement à évaluer le 2ème ou le 3ème opérateur, de sorte qu'il ne peut pas s'exécuter tous les effets secondaires de l'opérande qui n'est pas évalué. Code comme celui - true? func1() : func2()
de ne pas exécuter func2()
. Pour l'instant, donc bon.
Cependant, il existe une règle spéciale indiquant que le 2e et le 3e opérande doit obtenir implicitement type promu et mis en balance avec l' habitude de l'arithmétique des conversions. (Implicite des règles de promotion de type C expliqué ici). Cela signifie que la 2ème ou 3ème opérande va toujours être au moins aussi grand que l' int
.
Donc, il n'est pas question qu' true
et false
se trouvent être de type int
C parce que l'expression serait toujours donner au moins la taille d'un int
, peu importe.
Même si vous voulez réécrire l'expression d' sizeof(a ? (bool)true : (bool)false)
il serait encore de retour de la taille d'un int
!
C'est à cause de type implicites de la promotion par le biais d'habitude arithmétique des conversions.