A especificação C ++ define:
- a existência do operador 'less than' para parâmetros booleanos e, em caso afirmativo,
- o resultado das 4 permutações de parâmetros?
Em outras palavras, os resultados das seguintes operações são definidos pela especificação?
false < false
false < true
true < false
true < true
Na minha instalação (Centos 7, gcc 4.8.2), o código abaixo mostra o que eu esperaria (dado o histórico de C de representar falso como 0 e verdadeiro como 1):
false < false = false
false < true = true
true < false = false
true < true = false
Embora eu tenha certeza de que a maioria dos compiladores (todos?) Fornecerá a mesma saída, isso é legislado pela especificação C ++? Ou um compilador ofuscante, mas compatível com as especificações, pode decidir que verdadeiro é menor 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
emstd::vector<bool>
como&&
.p <= q
significap implies q
quandop
eq
é do tipo bool!<=
pode ser inadvertidamente lido como uma seta esquerda e que o lado direito "somente se" (isto é, [implica materialmente ") às vezes é tipicamente digitado ou informalmente escrito de forma semelhante a=>
(isto é, com um eixo duplo semelhante=
) . Às vezes, uma seta esquerda é lida como "se", embora eu acredite que isso seja muito menos comum do que o uso de uma seta direita para "somente se".Respostas:
TL; DR:
As operações são bem definidas de acordo com o rascunho do padrão C ++.
Detalhes
Podemos ver isso indo para a seção preliminar de
5.9
operadores do C ++ , que diz ( ênfase a minha adiante ):e bools são tipos aritemáticos de 3.9.1 Tipos fundamentais
e
e
true
efalse
são literais booleanos de2.14.6
literais booleanos:Voltando à seção
5.9
para ver a mecânica dos operadores relacionais, ele diz:as conversões aritméticas comuns são abordadas na seção
5
que diz:e a seção
4.5
diz:e então as expressões:
O uso dessas regras se torna:
fonte
Os valores booleanos estão sujeitos às promoções inteiras usuais, com
false
definido como0
etrue
definido como1
. Isso torna todas as comparações bem definidas.fonte
false
é definido como0
etrue
é definido como1
no padrão (e não apenas pela prática comum) precisa de evidências para apoiá-lo.bool
tipo, antes mesmo que houvesse C ++, o resultado de uma operação booleana era definido como0
falso e1
verdadeiro. Eu não ficaria surpreso se você puder encontrá-lo em K + R.<
(menor que),>
(maior que),<=
(menor ou igual a) e>=
(maior ou igual a) deve produzir 1 se a relação especificada for verdadeira e 0 se for false. O resultado tem o tipoint
".enum bool { false = 0, true = 1}
era legal, mas não definiu umoperator<
.De acordo com o padrão C ++ (operadores relacionais 5.9)
e
e (3.9.1 tipos fundamentais)
e (4.5 Promoções integrais)
Portanto, em todos os seus exemplos, true é convertido em int 1 e false é convertido em int 0
Essas expressões
são inteiramente equivalentes a
fonte
Booleano
false
é equivalente aint 0
, e booleanotrue
é equivalente aint 1
. Portanto, isso explica por que a expressãofalse < true
=>0 < 1
é a única que retornatrue
.fonte