Per quanto riguarda il tipo booleano in C
Un tipo booleano è stato introdotto abbastanza tardi nel linguaggio C, nell'anno 1999. Prima di allora, C non aveva un tipo booleano ma era invece usato int
per tutte le espressioni booleane. Pertanto tutti gli operatori logici come > == !
etc restituiscono un int
valore 1
o 0
.
Era personalizzato per le applicazioni utilizzare tipi fatti in casa come typedef enum { FALSE, TRUE } BOOL;
, che si riduce anche a int
tipi di dimensioni.
Il C ++ aveva un tipo booleano molto migliore ed esplicito bool
, che non era più grande di 1 byte. Mentre i tipi o le espressioni booleani in C finirebbero per 4 byte nel peggiore dei casi. Un certo modo di compatibilità con C ++ è stato introdotto in C con lo standard C99. C ha quindi ottenuto un tipo booleano _Bool
e anche l'intestazione stdbool.h
.
stdbool.h
fornisce una certa compatibilità con C ++. Questa intestazione definisce la macro bool
(stessa ortografia della parola chiave C ++) che si espande _Bool
, un tipo che è un tipo intero piccolo, probabilmente 1 byte grande. Allo stesso modo, l'intestazione fornisce due macro true
e la false
stessa ortografia delle parole chiave C ++, ma con retrocompatibilità con i programmi C precedenti . Pertanto true
ed false
espandersi in 1
e 0
in C e il loro tipo è int
. Queste macro non sono in realtà del tipo booleano come sarebbero le parole chiave C ++ corrispondenti.
Allo stesso modo, ai fini della retrocompatibilità, gli operatori logici in C tornano ancoraint
oggi, anche se al giorno C ha ottenuto un tipo booleano. In C ++, gli operatori logici restituiscono a bool
. Quindi un'espressione come sizeof(a == b)
darà la dimensione di a int
in C, ma la dimensione di a bool
in C ++.
Per quanto riguarda l'operatore condizionale ?:
L'operatore condizionale ?:
è un operatore strano con un paio di stranezze. È un errore comune credere che sia equivalente al 100% if() { } else {}
. Non proprio.
Esiste un punto di sequenza tra la valutazione del 1o e 2o o 3o operando. L' ?:
operatore ha la garanzia di valutare solo il 2o o il 3o operando, quindi non può eseguire alcun effetto collaterale dell'operando che non viene valutato. Il codice come true? func1() : func2()
non verrà eseguito func2()
. Fin qui tutto bene.
Tuttavia , esiste una regola speciale che afferma che il 2 ° e il 3 ° operando devono essere promossi in modo implicito e bilanciati l'uno contro l'altro con le solite conversioni aritmetiche . ( Regole implicite di promozione del tipo in C spiegate qui ). Ciò significa che il 2o o 3o operando sarà sempre almeno grande quanto un int
.
Quindi non importa true
e false
capita di essere di tipo int
in C perché l'espressione darebbe sempre almeno la dimensione di un int
non importa.
Anche se riscrivi l'espressione in esso, restituiresti comunque la dimensione di un !sizeof(a ? (bool)true : (bool)false)
int
Ciò è dovuto alla promozione del tipo implicito attraverso le solite conversioni aritmetiche.
sizeof(true)
edsizeof(false)
è anche 4: ide.geeksforgeeks.org/O5jvuN