La definición de C ++ define:
- la existencia del operador 'menor que' para parámetros booleanos, y si es así,
- ¿El resultado de las 4 permutaciones de 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 siguiente código escupe lo que esperaría (dado el historial de C de representar falso como 0 y verdadero como 1):
false < false = false
false < true = true
true < false = false
true < true = false
Si bien estoy bastante seguro de que la mayoría de los compiladores (¿todos?) Darán el mismo resultado, ¿está esto legislado por la especificación C ++? ¿O es un ofuscador, pero el compilador que cumple con las especificaciones puede decidir que verdadero 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;
}
std::min
enstd::vector<bool>
as&&
.p <= q
significap implies q
cuándop
yq
son de tipo bool!<=
podría leerse inadvertidamente como una flecha izquierda, y que la flecha "solo si" (es decir, [implica [materialmente] ") a veces se compone de un tipo o se escribe de manera informal=>
(es decir, con un eje doble parecido=
) . Una flecha izquierda incluso se lee a veces como "si", aunque creo que esto es mucho menos común que el uso de una flecha derecha para "solo si".Respuestas:
TL; DR:
Las operaciones están bien definidas de acuerdo con el borrador del estándar C ++.
Detalles
Podemos ver eso yendo al borrador de la sección estándar de C ++
5.9
Operadores relacionales que dice ( énfasis mío en adelante ):y bools son tipos aritmáticos de 3.9.1 Tipos fundamentales
y
y
true
yfalse
son literales booleanos de literales2.14.6
booleanos:Volviendo a la sección
5.9
para ver más a fondo la mecánica de los operadores relacionales, dice:Las conversiones aritméticas habituales se tratan en la sección
5
que dice:y la sección
4.5
dice:y entonces las expresiones:
El uso de estas reglas se convierte en:
fuente
Los valores booleanos están sujetos a las promociones enteras habituales, con
false
definido como0
ytrue
definido como1
. Eso hace que todas las comparaciones estén bien definidas.fuente
false
se define como0
ytrue
se define como1
en el estándar (en lugar de solo por la práctica común) necesita evidencia para respaldarlo.bool
tipo, incluso antes de que existiera C ++, el resultado de una operación booleana se definió como0
falso y1
verdadero. No me sorprendería si lo puedes encontrar en K + R.<
(menor que),>
(mayor que),<=
(menor o igual que), y>=
(mayor o igual que) producirá 1 si la relación especificada es verdadera y 0 si es falso. El resultado tiene tipoint
".enum bool { false = 0, true = 1}
era legal pero no definía unoperator<
.De acuerdo con el estándar C ++ (5.9 operadores relacionales)
y
y (3.9.1 Tipos fundamentales)
y (4.5 Promociones integrales)
Entonces, en todos sus ejemplos, verdadero se convierte en int 1 y falso se convierte en int 0
Estas expresiones
son enteramente equivalentes a
fuente
Boolean
false
es equivalente aint 0
, y booleantrue
es equivalente aint 1
. Entonces esto explica por qué la expresiónfalse < true
=>0 < 1
es la única que regresatrue
.fuente