Ist der Betrieb "false" < "wahr" auch definiert?

Funktioniert die C++ - Spezifikation definieren:

  1. der Existenz der "kleiner als" operator für boolean-Parameter, und wenn ja,
  2. 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 auf std::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 bedeutet p implies q wenn p und q 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 wie q impliziert p, aber in der Tat bedeutet p impliziert q.
  • 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.

InformationsquelleAutor duncan | 2014-10-01
Schreibe einen Kommentar