Concernant le type booléen en C
Un type booléen a été introduit assez tardivement dans le langage C, en 1999. Auparavant, C n'avait pas de type booléen mais était plutôt utilisé int
pour toutes les expressions booléennes. Par conséquent, tous les opérateurs logiques tels que > == !
etc renvoient une int
valeur 1
ou 0
.
Il était habituel pour les applications d'utiliser des types faits maison tels que typedef enum { FALSE, TRUE } BOOL;
, qui se résume également à des int
types de taille réduite.
C ++ avait un type booléen bien meilleur et explicite bool
, qui ne dépassait pas 1 octet. Alors que les types ou expressions booléens en C finiraient par 4 octets dans le pire des cas. Une certaine compatibilité avec C ++ a été introduite en C avec la norme C99. C a alors obtenu un type booléen _Bool
et également l'en-tête stdbool.h
.
stdbool.h
fournit une certaine compatibilité avec C ++. Cet en-tête définit la macro bool
(même orthographe que le mot clé C ++) qui se développe en _Bool
, un type qui est un petit type entier, probablement 1 octet de large. De même, l'en-tête fournit deux macros true
et la false
même orthographe que les mots-clés C ++, mais avec une compatibilité descendante avec les programmes C plus anciens . Par conséquent, true
et false
développez vers 1
et 0
dans C et leur type est int
. Ces macros ne sont pas réellement de type booléen comme le seraient les mots-clés C ++ correspondants.
De même, à des fins de compatibilité ascendante, les opérateurs logiques en C renvoient toujours un int
à ce jour, même si C de nos jours a un type booléen. En C ++, les opérateurs logiques renvoient un bool
. Ainsi, une expression telle que sizeof(a == b)
donnera la taille d'un int
en C, mais la taille d'un bool
en C ++.
Concernant l'opérateur conditionnel ?:
L'opérateur conditionnel ?:
est un opérateur étrange avec quelques bizarreries. C'est une erreur courante de croire que cela équivaut à 100% if() { } else {}
. Pas assez.
Il y a un point de séquence entre l'évaluation du 1er et du 2ème ou 3ème opérande. Il ?:
est garanti que l'opérateur n'évalue que le 2ème ou le 3ème opérande, il ne peut donc exécuter aucun effet secondaire de l'opérande qui n'est pas évalué. Le code comme true? func1() : func2()
ne s'exécutera pas func2()
. Jusqu'ici tout va bien.
Cependant , il existe une règle spéciale indiquant que les 2ème et 3ème opérandes doivent être implicitement promus et équilibrés les uns par rapport aux autres avec les conversions arithmétiques habituelles . ( Les règles de promotion de type implicite en C expliquées ici ). Cela signifie que le 2ème ou 3ème opérande sera toujours au moins aussi grand qu'un int
.
Donc cela n'a pas d'importance true
et false
il se trouve qu'il est de type int
en C parce que l'expression donnerait toujours au moins la taille d'un int
peu importe.
Même si vous réécriviez l'expression, elle renverrait toujours la taille d'un !sizeof(a ? (bool)true : (bool)false)
int
Cela est dû à la promotion de type implicite via les conversions arithmétiques habituelles.
sizeof(true)
etsizeof(false)
c'est aussi 4: ide.geeksforgeeks.org/O5jvuN