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 intper tutte le espressioni booleane. Pertanto tutti gli operatori logici come > == !etc restituiscono un intvalore 1o 0.
Era personalizzato per le applicazioni utilizzare tipi fatti in casa come typedef enum { FALSE, TRUE } BOOL;, che si riduce anche a inttipi 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 _Boole anche l'intestazione stdbool.h.
stdbool.hfornisce 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 truee la falsestessa ortografia delle parole chiave C ++, ma con retrocompatibilità con i programmi C precedenti . Pertanto trueed falseespandersi in 1e 0in 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 intin C, ma la dimensione di a boolin 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 truee falsecapita di essere di tipo intin C perché l'espressione darebbe sempre almeno la dimensione di un intnon 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