bitwise - overload operator c++
¿La operación "falso<verdadero" está bien definida? (4)
Boolean false
es equivalente a int 0
, y boolean true
es equivalente a int 1
. Esto explica por qué la expresión false < true
=> 0 < 1
es la única que devuelve true
.
¿La especificación de C ++ define:
- la existencia del operador ''menor que'' para los parámetros booleanos, y si es así,
- el resultado de las permutaciones de 4 parámetros?
En otras palabras, ¿los resultados de las siguientes operaciones están definidos por la especificación?
false < false
false < true
true < false
true < true
En mi configuración (Centos 7, gcc 4.8.2), el código siguiente arroja lo que esperaba (dado el historial de C de representar falsa como 0 y verdadera como 1):
false < false = false
false < true = true
true < false = false
true < true = false
Aunque estoy bastante seguro de que la mayoría (¿todos?) Los compiladores darán el mismo resultado, ¿está esto legislado por la especificación C ++? ¿O es que un compilador ofuscante, pero que cumpla con las especificaciones, puede decidir que true es menos que falso?
#include <iostream>
const char * s(bool a)
{
return (a ? "true" : "false");
}
void test(bool a, bool b)
{
std::cout << s(a) << " < " << s(b) << " = " << s(a < b) << std::endl;
}
int main(int argc, char* argv[])
{
test(false, false);
test(false, true);
test(true, false);
test(true, true);
return 0;
}
De acuerdo con el estándar C ++ (5.9 operadores relacionales)
2 Las conversiones aritméticas habituales se realizan en operandos de tipo aritmético o de enumeración.
y
1 ... El tipo de resultado es bool.
y (3.9.1 Tipos fundamentales)
6 Los valores de tipo bool son verdaderos o falsos.49 [Nota: no hay tipos o valores de bool con signo, sin signo, corto o largo. -finalizar nota] Los valores de tipo bool participan en promociones integrales (4.5).
y (4.5 promociones integrales)
6 Un prvalue de tipo bool se puede convertir en un prvalue de tipo int, con falso que se convierte en cero y verdadero que se convierte en uno .
Entonces, en todos los ejemplos, true se convierte a int 1 y false se convierte a int 0
Estas expresiones
false < false
false < true
true < false
true < true
son completamente equivalentes a
0 < 0
0 < 1
1 < 0
1 < 1
Los valores booleanos están sujetos a las promociones enteras usuales, con false
definida como 0
y true
definida como 1
. Eso hace que todas las comparaciones estén bien definidas.
TL; DR:
Las operaciones están bien definidas según el borrador del estándar C ++.
Detalles
Podemos verlo yendo al borrador de la sección 5.9
estándares de C ++ , operadores relacionales que dice (el énfasis es mío en el futuro ):
Los operandos deben tener aritmética , enumeración o tipo de puntero o tipo std :: nullptr_t. Los operadores <(menor que),> (mayor que), <= (menor o igual que) y> = (mayor que o igual a) arrojan valores falsos o verdaderos. El tipo de resultado es bool
y bools son tipos aritmáticos de 3.9.1 Tipos fundamentales
Los tipos bool , char, char16_t, char32_t, wchar_t y los tipos enteros con signo y sin signo se denominan colectivamente tipos integrales.
y
Los tipos integrales y flotantes se denominan colectivamente tipos aritméticos.
y true
y false
son literales booleanos de 2.14.6
literales booleanos:
boolean-literal:
false
true
Volviendo a la sección 5.9
para ver más allá la mecánica de los operadores relacionales, dice:
Las conversiones aritméticas habituales se realizan en operandos de tipo aritmético o de enumeración.
las conversiones aritméticas usuales están cubiertas en la sección 5
que dice:
De lo contrario, las promociones integrales (4.5) se realizarán en ambos operandos
y la sección 4.5
dice:
Un prvalue de tipo bool se puede convertir a un prvalue de tipo int, con falso convirtiéndose en cero y verdadero convirtiéndose en uno.
y entonces las expresiones:
false < false
false < true
true < false
true < true
usando estas reglas se convierten en:
0 < 0
0 < 1
1 < 0
1 < 1