Czy specyfikacja C ++ definiuje:
- istnienie operatora „mniejsze niż” dla parametrów logicznych, a jeśli tak,
- wynik permutacji 4 parametrów?
Innymi słowy, czy wyniki następujących operacji są zdefiniowane w specyfikacji?
false < false
false < true
true < false
true < true
W mojej konfiguracji (Centos 7, gcc 4.8.2) poniższy kod wypluwa to, czego bym się spodziewał (biorąc pod uwagę historię C reprezentowania fałszu jako 0 i prawdy jako 1):
false < false = false
false < true = true
true < false = false
true < true = false
Chociaż jestem prawie pewien, że większość (wszystkich?) Kompilatorów da takie same dane wyjściowe, czy jest to uregulowane w specyfikacji C ++? A może zaciemniający, ale zgodny ze specyfikacją kompilator może zdecydować, że prawda jest mniejsza niż fałsz?
#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
nastd::vector<bool>
co&&
.p <= q
środkip implies q
kiedyp
iq
są typu BOOL!<=
może być przypadkowo odczytane jako strzałka w lewo i że „tylko jeśli” (tj. „[Materialnie] sugeruje”) strzałka w prawo jest czasami składana lub nieformalnie zapisywana podobnie do=>
(tj. Z podwójnym trzonem przypominającym=
) . Czasami nawet czyta się lewą strzałkę jako „jeśli”, chociaż uważam, że jest to znacznie mniej powszechne niż użycie prawej strzałki dla określenia „tylko jeśli”.Odpowiedzi:
TL; DR:
Operacje są dobrze zdefiniowane zgodnie z projektem standardu C ++.
Detale
Widzimy to przechodząc do szkicu standardowej sekcji C ++
5.9
Operatory relacyjne, która mówi ( podkreślenie moje w przód ):a bools są typami aritematycznymi z 3.9.1 Typy podstawowe
i
i
true
ifalse
są logiczne literałów z2.14.6
logicznych literałów:Wracając do sekcji,
5.9
aby dokładniej przyjrzeć się mechanice operatorów relacyjnych, jest napisane:to zwykłe konwersje arytmetyczne są objęte w części
5
, która mówi:a sekcja
4.5
mówi:a więc wyrażenia:
korzystając z tych reguł należy:
źródło
Wartości logiczne podlegają zwykłym promocjom na liczby całkowite, przy czym
false
zdefiniowano jako0
itrue
zdefiniowano jako1
. To sprawia, że wszystkie porównania są dobrze zdefiniowane.źródło
false
jest zdefiniowany0
itrue
zdefiniowany jako1
standard (a nie tylko przez powszechną praktykę), wymaga dowodów na poparcie tego.bool
typ, zanim jeszcze istniał C ++, wynik operacji logicznej był definiowany jako0
fałsz i1
prawda. Nie zdziwiłbym się, gdybyś mógł go znaleźć w K + R.<
(mniejszy niż),>
(większy niż),<=
(mniejszy lub równy) i>=
(większy lub równy) daje 1, jeśli określona relacja jest prawdziwa, i 0, jeśli jest fałsz. Wynik ma typint
. "enum bool { false = 0, true = 1}
było legalne, ale nie zdefiniowałooperator<
.Zgodnie ze standardem C ++ (5.9 Operatory relacyjne)
i
i (3.9.1 Podstawowe typy)
i (4.5 promocje integralne)
Zatem we wszystkich twoich przykładach wartość true jest konwertowana na liczbę int 1, a fałsz na liczbę całkowitą 0
Te wyrażenia
są całkowicie równoważne z
źródło
Boolean
false
jest równoważnyint 0
, a booleantrue
jest równoważnyint 1
. To wyjaśnia, dlaczego wyrażeniefalse < true
=>0 < 1
jest jedynym, które zwracatrue
.źródło