En cuanto al tipo booleano en C
Un tipo booleano se introdujo bastante tarde en el lenguaje C, en el año 1999. Antes de eso, C no tenía un tipo booleano, sino que se usaba intpara todas las expresiones booleanas. Por lo tanto, todos los operadores lógicos como > == !etc. devuelven un intvalor 1o 0.
Fue personalizado para las aplicaciones utilizar tipos caseros como typedef enum { FALSE, TRUE } BOOL;, que también se reduce a inttipos de tamaño.
C ++ tenía un tipo booleano mucho mejor y explícito bool, que no era mayor de 1 byte. Mientras que los tipos booleanos o expresiones en C terminarían como 4 bytes en el peor de los casos. Se introdujo algún tipo de compatibilidad con C ++ en C con el estándar C99. C luego obtuvo un tipo booleano _Booly también el encabezado stdbool.h.
stdbool.hProporciona cierta compatibilidad con C ++. Este encabezado define la macro bool(la misma ortografía que la palabra clave C ++) que se expande a _Bool, un tipo que es un tipo entero pequeño, probablemente 1 byte grande. Del mismo modo, la cabecera proporciona dos macros truey false, misma ortografía como palabras clave C ++, pero con compatibilidad con versiones anteriores de los programas en C de más edad . Por lo tanto truey falseampliar a 1y 0en C y su tipo es int. Estas macros no son en realidad del tipo booleano como lo serían las palabras clave correspondientes de C ++.
Del mismo modo, para fines de compatibilidad con versiones anteriores, los operadores lógicos en C aún devuelven un inthasta el día de hoy, a pesar de que C actualmente tiene un tipo booleano. Mientras que en C ++, los operadores lógicos devuelven a bool. Por lo tanto, una expresión tal como sizeof(a == b)dará el tamaño de an inten C, pero el tamaño de a boolen C ++.
Sobre el operador condicional ?:
El operador condicional ?:es un operador extraño con un par de peculiaridades. Es un error común creer que es 100% equivalente a if() { } else {}. No exactamente.
Hay un punto de secuencia entre la evaluación del primer y segundo o tercer operando. Se ?:garantiza que el operador solo evaluará el segundo o el tercer operando, por lo que no puede ejecutar ningún efecto secundario del operando que no se evalúe. Código como true? func1() : func2()no se ejecutará func2(). Hasta aquí todo bien.
Sin embargo , hay una regla especial que establece que los operandos segundo y tercero deben obtener implícitamente el tipo promocionado y equilibrado entre sí con las conversiones aritméticas habituales . ( Las reglas de promoción de tipo implícito en C se explican aquí ). Esto significa que el segundo o tercer operando siempre será al menos tan grande como un int.
Por lo tanto, no importa eso truey falseresulta ser de tipo intC porque la expresión siempre daría al menos el tamaño de un intno importa.
¡Incluso si reescribiera la expresión , aún devolvería el tamaño de un !sizeof(a ? (bool)true : (bool)false) int
Esto se debe a la promoción de tipo implícito a través de las conversiones aritméticas habituales.
sizeof(true)ysizeof(false)también es 4: ide.geeksforgeeks.org/O5jvuN