(¿Dónde) define el estándar C el resultado de sumar/restar dos booleanos?
El estándar C11 define el tipo _Bool
(6.2.5.2) como un tipo entero sin signo estándar (6.2.5.6) y, según leo el estándar, _Bool
también es un tipo aritmético (6.2.5.18 a través de 6.2.5.7 y 6.2.5.17).
Además, se especifica que para +
y -
, “ambos operandos deben tener tipo aritmético, o un operando debe ser un puntero a un tipo de objeto completo y el otro debe tener tipo entero” (6.5.6.2).
Sin embargo, en cuanto al resultado, solo puedo ver “El resultado del operador binario + es la suma de los operandos” (6.5.6.5) y “El resultado del operador binario – es la diferencia resultante de la resta del segundo operando del primero” (6.5.6.6). Para dos valores booleanos, “suma” puede interpretarse como un OR lógico, pero no creo que “resta” tenga un significado bien definido.
Entonces, la pregunta es: ¿el resultado de a+b
y a-b
(donde a
y b
tienen tipo _Bool
) está definido como comportamiento indefinido en C11 o el estándar define claramente el resultado de estas operaciones (en caso afirmativo, ¿dónde?)?
Nota: tal vez el estándar solo ve a _Bool
como un entero con un rango muy limitado. En ese caso, esperaría que true
+true
fuera 0
(1 + 1 módulo 2). Sin embargo, GCC dice que es 1.
davy.ai
Basándose en la información proporcionada en el estándar C11, no está del todo claro cuál sería el resultado de
a+b
ya-b
cuandoa
yb
tienen tipo_Bool
. El estándar define_Bool
como un tipo de entero sin signo estándar y un tipo aritmético, pero no proporciona ninguna regla específica para realizar operaciones aritméticas en valores_Bool
.Además, el estándar especifica que ambos operandos de los operadores
+
y-
deben tener tipo aritmético, o uno de los operandos debe ser un puntero a un tipo de objeto completo y el otro debe tener tipo entero. Dado que_Bool
se considera un tipo aritmético, es legal usarlo como operando para estos operadores.Sin embargo, cuando se trata de interpretar el resultado de estas operaciones para valores
_Bool
, el estándar no dice nada. La definición de+
solo especifica que el resultado es la suma de los operandos, mientras que la definición de-
solo especifica que el resultado es la diferencia resultante de restar el segundo operando del primero. No hay indicación de cómo se deben aplicar estas definiciones a los valores_Bool
.Es posible que el estándar vea
_Bool
como otro tipo de entero con un rango muy pequeño, en cuyo casoverdadero
+verdadero
debería interpretarse como0
yverdadero
–verdadero
debería interpretarse como0
. Sin embargo, esta interpretación no está explícitamente establecida en el estándar, por lo que también es posible que los compiladores implementen estas operaciones de manera diferente.En conclusión, aunque es legal usar valores
_Bool
como operandos para los operadores+
y-
, el resultado de estas operaciones es indefinido según el estándar C11.