Ist der Betrieb "false" < "wahr" auch definiert?
Funktioniert die C++ - Spezifikation definieren:
- der Existenz der "kleiner als" operator für boolean-Parameter, und wenn ja,
- das Ergebnis der 4-parameter-Permutationen?
In anderen Worten, sind die Ergebnisse aus den folgenden Operationen definiert, die von der Spezifikation?
false < false
false < true
true < false
true < true
Auf meiner Installation (Centos 7, gcc 4.8.2) , wird der code unten spuckt, was ich erwarten würde (gegeben C s Geschichte der Vertretung false als 0 und true als 1):
false < false = false
false < true = true
true < false = false
true < true = false
Während ich bin mir ziemlich sicher, dass die meisten (alle?) Compiler geben die gleiche Ausgabe, ist dieser erließ die von der C++ - Spezifikation? Oder ist eine Verschleierung, aber Spezifikations-konformen compiler erlaubt zu entscheiden, dass das wahr ist weniger als false?
#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;
}
- g++-4.9.0 und clang++-3.5.0 auf Linux denke, es ist unauffällig: coliru.stacked-crooked.com/a/2174ebc466d0c445
- Es sind gültige Verwendungen. Wie mit
std::min
aufstd::vector<bool>
als&&
. - wenn Sie herausfinden können, eine gute Frage, die noch nicht gefragt worden, nach all diesen Jahren von StackOverflow, die Sie verdienen einige Punkte. Es ist nicht trolling.
- Die motivation für die Frage ist echt: ich bin ziemlich neu in C++ (aus C) und speichern möchten einige Objekte in einem std::set<>. Meine Umsetzung meines Objekts < Betreiber ist in Erster Linie auf eine boolean-Eigenschaft des Objekts, gefolgt von anderen sekundären Identifizierung von Eigenschaften. Bei der Iteration über die Menge, will ich sicher sein, dass die 'falschen' Sachen kommen zuerst. Während es funktioniert für mich, hier und jetzt, ich bin auf der Suche nach Beruhigung es ist garantiert, um auf allen Plattformen funktionieren (einschließlich der eingebetteten Bilder) ohne Rückgriff unnötig auf die Verwendung von (a ? 1 : 0), oder ähnliches, in meinem Objekt < Betreiber.
- Eine störende Konsequenz ist, dass
p <= q
bedeutetp implies q
wennp
undq
sind vom Typ bool! - Ich bin mir nicht klar, was Sie störend finden, dass. Könnte man sagen, ein bisschen mehr?
- Vermutlich das, was stört, ist, dass
<=
vielleicht versehentlich Lesen als leftarrow, und dass das "nur wenn" (D. H., "[materiell] impliziert") rightarrow wird manchmal gesetzt oder informell geschrieben, ähnlich wie=>
(d.h., mit einer verdoppelten Welle ähnlich=
). Ein leftarrow ist schon manchmal lese, wie "wenn", obwohl ich glaube, das ist weit weniger verbreitet als die Nutzung eines rightarrow für "nur, wenn." - Genau wie Eliah sagte.
p <= q
sieht aus wieq
impliziertp
, aber in der Tat bedeutetp
impliziertq
. - Seien Sie sehr vorsichtig mit diesem, wenn Sie die Interaktion mit COM-und/oder Sql-Server wie Sie manchmal definieren Sie true als -1.
- Anscheinend ist es gut definiert ist. Das ist traurig. Wie eine Sprache bemüht zu schwer beliebt zu sein. Auch wenn es vielleicht eine Gefälligkeit ", um" wahr und falsch, es ist logisch absurd. Also, wenn der Bestellung von true und false ist ein design-überlegungen in einem Modell, IMO, der Autor sollte gezwungen werden, zu wählen, die Bestellung ausdrücklich zu. Was solls, der nächste Schritt könnte sein, wahr oder falsch) ist weniger als wahr oder wahr -, weil zwei echte beats einen wahren.
- "ist das Gesetze erlassen, die von der C++..." ich hoffe, dass Programme nicht starten, schreiben Gesetze...
- viele Compiler haben Erweiterungen, die nicht Teil des standard. Auch gibt es Bereiche, in denen der standard erklärt, dass das Verhalten wird durch die Implementierung definiert(anders, als Undefiniertes Verhalten) bedeutet, könnte es variiert von compiler zu compiler und immer noch erlaubt, von der standard. Also dies ist eine wichtige Unterscheidung, und diese Art von Frage, die in der Regel macht es einer Sprache, die Anwalt Frage.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TL;DR:
Die Operationen sind gut definiert, nach dem Entwurf der C++ - standard.
Details
Können wir sehen, dass durch die Entwurf der C++ - standard Abschnitt
5.9
Relationale Operatoren, die sagt (Hervorhebung von mir geht nach vorn):bools und sind arithematic Arten von 3.9.1 Grundlegende Arten
und
sowie
true
undfalse
sind die booleschen Literale aus2.14.6
Boolean-Literale:Gehen Sie zurück zu Abschnitt
5.9
zu sehen, die mechanik der relationalen Operatoren weiter heißt es:den üblichen arithmetischen Umwandlungen bedeckt sind, die in Abschnitt
5
sagt:und Abschnitt
4.5
sagt:und so sind die Ausdrücke:
anhand dieser Regeln werden:
Boolesche Werte unterliegen den üblichen integer-promotions, mit
false
definiert als0
undtrue
definiert als1
. Das macht alle Vergleiche gut definiert.false
ist definiert als0
undtrue
ist definiert als1
der standard (anstatt nur durch eine gemeinsame Praxis) braucht Beweise um es wieder auf.bool
geben, bevor es war sogar C++, das Ergebnis einer booleschen operation wurde definiert als0
für falsch und1
für wahr. Ich wäre nicht überrascht, wenn Sie finden es in K+R.bool
von Anfang an (wenn ich merke0
und1
verwendet wurden, bevorbool
gab es in früheren Sprachen). Aber dann hab ich nur so viel wie gesehen K+R-code einmal in meinem Leben, so meine Kenntnisse, die Geschichte ist verdächtig.<
(kleiner als),>
(größer als),<=
(kleiner oder gleich), und>=
(größer als oder gleich) soll-Ertrag 1, wenn die angegebene relation wahr ist und 0 falls es falsch ist. Das Ergebnis hat den Typint
."enum bool { false = 0, true = 1}
war legal, aber nicht definierenoperator<
.Entsprechend der C++ - Standard (5.9 Relationale Operatoren)
und
und (3.9.1 Grundlegende Arten)
und (4.5 Integrale Promotionen)
So, in all deinen Beispielen wahr ist, konvertiert zu int-1 und false in int konvertiert, 0
Diese Ausdrücke
sind völlig gleichwertig zu
Boolean
false
entsprichtint 0
und booleantrue
entsprichtint 1
.Also das erklärt, warum der Ausdruck
false < true
=>0 < 1
ist die einzige, die zurücktrue
.