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 int
para todas las expresiones booleanas. Por lo tanto, todos los operadores lógicos como > == !
etc. devuelven un int
valor 1
o 0
.
Fue personalizado para las aplicaciones utilizar tipos caseros como typedef enum { FALSE, TRUE } BOOL;
, que también se reduce a int
tipos 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 _Bool
y también el encabezado stdbool.h
.
stdbool.h
Proporciona 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 true
y 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 true
y false
ampliar a 1
y 0
en 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 int
hasta 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 int
en C, pero el tamaño de a bool
en 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 true
y false
resulta ser de tipo int
C porque la expresión siempre daría al menos el tamaño de un int
no 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