Definiert die C ++ - Spezifikation:
- die Existenz des Operators 'kleiner als' für boolesche Parameter, und wenn ja,
- das Ergebnis der 4 Parameter Permutationen?
Mit anderen Worten, sind die Ergebnisse der folgenden Operationen durch die Spezifikation definiert?
false < false
false < true
true < false
true < true
In meinem Setup (Centos 7, gcc 4.8.2) spuckt der folgende Code aus, was ich erwarten würde (angesichts der Geschichte von C, in der false als 0 und true als 1 dargestellt wird):
false < false = false
false < true = true
true < false = false
true < true = false
Obwohl ich mir ziemlich sicher bin, dass die meisten (alle?) Compiler die gleiche Ausgabe liefern, ist dies in der C ++ - Spezifikation gesetzlich geregelt? Oder darf ein verschleierter, aber spezifikationskonformer Compiler entscheiden, dass wahr weniger als falsch ist?
#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
aufstd::vector<bool>
wie&&
.p <= q
Mittel ,p implies q
wennp
undq
vom Typ Bool ist!<=
dies versehentlich als linker Pfeil gelesen werden kann und dass der "nur wenn" (dh "[materiell] impliziert") rechte Pfeil manchmal ähnlich gesetzt oder informell geschrieben ist wie=>
(dh mit einem doppelten Schaft ähnlich=
). . Ein linker Pfeil wird sogar manchmal als "wenn" gelesen, obwohl ich glaube, dass dies weitaus seltener ist als die Verwendung eines rechten Pfeils für "nur wenn".Antworten:
TL; DR:
Die Operationen sind gemäß dem Entwurf des C ++ - Standards gut definiert.
Einzelheiten
Wir können sehen , dass von dem Teilwert Entwurf C ++ Standard Abschnitt
5.9
Vergleichsoperatoren , die sagt ( Hervorhebung von mir für die Zukunft ):und Bools sind arithematische Typen aus 3.9.1 Grundtypen
und
und
true
undfalse
sind boolesche Literale von2.14.6
booleschen Literalen:Zurück zum Abschnitt
5.9
, um die Mechanik der Vergleichsoperatoren weiter zu sehen, heißt es:Die üblichen arithmetischen Umrechnungen werden in folgenden Abschnitten behandelt
5
:und Abschnitt
4.5
sagt:und so die Ausdrücke:
mit diesen Regeln werden:
quelle
Boolesche Werte unterliegen den üblichen ganzzahligen Heraufstufungen,
false
definiert als0
undtrue
definiert als1
. Das macht alle Vergleiche gut definiert.quelle
false
der als Standard definiert ist0
undtrue
wie1
im Standard definiert ist (und nicht nur durch gängige Praxis), Beweise benötigt, um dies zu belegen.bool
Typ gab, bevor es überhaupt C ++ gab, wurde das Ergebnis einer booleschen Operation als0
für falsch und1
für wahr definiert. Es würde mich nicht wundern, wenn Sie es in K + R finden können.<
(kleiner als),>
(größer als),<=
(kleiner als oder gleich) und>=
(größer als oder gleich) muss 1 ergeben, wenn die angegebene Beziehung wahr ist, und 0, wenn dies der Fall ist." false. Das Ergebnis hat den Typint
. "enum bool { false = 0, true = 1}
legal war, aber keine definiertoperator<
.Nach dem C ++ Standard (5.9 Vergleichsoperatoren)
und
und (3.9.1 Grundtypen)
und (4.5 Integrale Werbeaktionen)
In all Ihren Beispielen wird true in int 1 und false in int 0 konvertiert
Diese Ausdrücke
sind völlig gleichwertig mit
quelle
Boolean
false
ist äquivalent zuint 0
und Booleantrue
ist äquivalent zuint 1
. Dies erklärt, warum der Ausdruckfalse < true
=>0 < 1
der einzige ist, der zurückgibttrue
.quelle