es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

(¿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.

Tags:  , , , ,

Answer

  1. Avatar for 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 y a-b cuando a y b 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 caso verdadero + verdadero debería interpretarse como 0 y verdaderoverdadero debería interpretarse como 0. 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.

Comments are closed.