Können zwei Boolesche Werte miteinander verglichen werden, die in C++?
Ist das folgende Stück code funktionieren soll?
bool b1 = true;
bool b2 = 1 < 2;
if (b1 == b2)
{
//do something
}
Ich vermute, dass nicht alle "Wahrheiten" sind gleich.
Willst du damit sagen, dass Sie diese getestet code und die "// etwas tun" - Teil nicht ausgeführt?
was soll der Unterschied zwischen wahr und falsch sein?
Ja, natürlich 🙂 Mein Szenario war eher komplizierter, aber im Prinzip ja. (Vielleicht habe ich etwas anderes falsch gemacht, aber nach dem umschreiben des == mein problem gelöst).
Wenn Sie konvertieren
Dann wird die Differenz verursacht wurde durch die "eher kompliziert" - Teil, nicht durch die vereinfachte version, die du gepostet hast.
was soll der Unterschied zwischen wahr und falsch sein?
Ja, natürlich 🙂 Mein Szenario war eher komplizierter, aber im Prinzip ja. (Vielleicht habe ich etwas anderes falsch gemacht, aber nach dem umschreiben des == mein problem gelöst).
Wenn Sie konvertieren
true
eine Ganzzahl, es ist 1
. Wenn Sie konvertieren eine ganze Zahl in einen booleschen Wert, einen anderen Wert als null ist true
.Dann wird die Differenz verursacht wurde durch die "eher kompliziert" - Teil, nicht durch die vereinfachte version, die du gepostet hast.
InformationsquelleAutor danatel | 2010-02-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja. Alle Wahrheiten sind gleich.
==
betroffen ist. Es sei denn, der Programmierer hat so etwas wie überschreibenoperator==
immer zurückfalse
. Da nichts in der Frage ist ein Objekt, das nicht der Fall sein.Ich werde die Messlatte auf diese Antwort: alle falses sind gleichermaßen falsch.
In der Tat, Sie senkte die bar. Da falses wurden immer gleich, auch in C.
Die komplette Regel wäre: "Alle Wahrheiten sind gleich. Alle falses gleich sind. Alle Wahrheiten sind gleich wahr. Alle falses sind gleichermaßen falsch. Endlich, wahr ist anders falsch."
Ich glaube nicht, dass
(void *) 0
,0
, und0.0
sind alle gleich, aber Sie sind alle falsch in C.InformationsquelleAutor Daniel Daranas
Ja, Boolesche Werte können nur speichern, true oder false, und vergleichen kann man die Werte für die Gleichstellung.
Jedoch einige schlecht verwendet von bool-Variablen können dazu führen, "undefined" Verhalten und Aussehen könnte, als wenn es weder wahr, noch falsch. Zum Beispiel beim Lesen der Wert einer nicht initialisierten automatischen Variablen oder direkten Speicher kopieren von ganzen zahlen.
Werfen Sie einen Blick auf die folgende (schlechte) Beispiel:
Auf Visual Studio 9, es zeigt:
Wahrscheinlich, weil der compiler hat direkt zu vergleichen, werden die Werte gespeichert.
Technisch ist das Undefiniertes Verhalten kommt aus bad nutzen, ein Wurf, der nicht den Typ boolean.
Ja, ich bin damit einverstanden, dass die Linie 3 ist nicht "richtiger code". Es war ein kurzes Beispiel, um zu demonstrieren, dass der Satz: "nicht alle" Wahrheiten "sind gleich" wahr sein kann.
Memory-mapped-Strukturen. Ziemlich Häufig in C/C++ - Programmierung.
InformationsquelleAutor J. Calleja
Ja, wie schon andere gesagt haben bools verglichen werden kann, für die Gleichheit in C++. Sie können sich denken, Dinge, die Sie hörte von C. Da C hat keinen Typ bool, Boolean Werte sind dargestellt als Ganzzahlen. In einem booleschen Kontext alle nicht-null-integer ist wahr. Jedoch, Sie könnte verschiedene Bitmuster und damit nicht gleich sein. So ist die Regel in C war nicht zu vergleichen 'Boolean'.
Edit: pro Kommentare, C99 hat einen bool-Typ. Aber der Punkt der Antwort war zu zeigen warum die Idee, nicht zu vergleichen bools ist im Umlauf. Es basiert auf der langen Geschichte des C vor C99.
Sie sicher, und Sie haben, um mit C99 mit einem speziellen header, um eine echte bool-Typ. Es ist ein Schritt nach vorn, aber nicht vollständig.
InformationsquelleAutor Steve Fallows
Beim zuweisen der ganzzahligen Wert ein boolean-Objekt (oder initialisiert boolean-Objekt mit einem ganzzahligen Wert) es ist implizit in eine
true
oderfalse
durch eine standard-boolean-Konvertierung (4.12). Also, von der Sprache der Sicht Ihrer1
und2
sind spurlos verschwunden, lange bevor Sie auch tun, der Vergleich. Sie beide haben sich die gleichetrue
. Es gibt kein "alle Wahrheiten sind gleich" Thema hier. Es gibt nur einetrue
.Natürlich einige compiler könnte wohl noch eine "lazy" - Ansatz und halten mehrere verschiedene "Wahrheiten" um, so dass Sie sicher, dass Sie "alle sind gleich" im moment des Vergleichs und so, aber ich bezweifle, dass dies eine vernünftige/brauchbare Ansatz.
In anderen Worten, in einem angemessenen Umsetzung sollten Sie erwarten nicht nur den Vergleich zu halten gilt, aber einen viel stärker Vergleich, um wahr zu sein:
Ist dies nicht gewährleistet, durch die Sprache, aber im Alltag, beschreiben nicht die physische Seite der die situation ganz gut.
InformationsquelleAutor AnT
In C mit
int
s Sie vielleicht einen Punkt haben (obwohl ich auch hier denke, dass diese bestimmte Reihenfolge wäre OK). In C++, ja, das ist sicher.InformationsquelleAutor T.E.D.
In C++
bool
ist seine eigene Art, mit der zwei mögliche Wertetrue
undfalse
. Alle Vergleiche gehen wird, als Sie erwarten. Alletrue
booleschen Werte sind die gleiche Sache, und das gleiche mit allenfalse
. Es ist wahr, dass nicht alle Ausdrücke, die Sie auswerten können, umtrue
oderfalse
sind die gleichen.In C89, gehen soweit zurück wie ich will, alle den Wert null (Zeiger-oder numerischen Typ) ist false, und alles andere ist true. Dies bedeutet, dass die wahren Werte sind nicht notwendigerweise einander gleich.
1
und2
sind wahre Werte, aber1 != 2
, und1 & 2
ergibt 0, was falsch ist.Es ist auch möglich, dass C89 falschen Werte nicht vergleichen gleich, obwohl Sie auf jede Implementierung, die ich je benutzt habe. Eine null-Zeiger-Wert ist eine Konstante integral null cast auf einen Zeiger-Wert. Es ist möglich für einen nicht-Konstanten Wert 0 cast auf einen Zeiger-Wert, der nicht null-Zeiger (und es gibt Systeme, bei denen null-Zeiger wurden nicht alle bits 0). Daher
(void *)0
ist eine null-Zeiger-Wert, und daher falsch, aberint i;...i = 0;...(void *)i
könnte möglicherweise nicht eine null-Zeiger-Wert, und damit auch nicht falsch.Jedoch in C89 alle Operationen, die beabsichtigen, einen booleschen Wert zurück (wie
&&
oder==
zum Beispiel), wird return 1 oder 0, so dass(1 == 3) == (4 ==3)
.InformationsquelleAutor David Thornley
Sind die Probleme nur, wenn man verwendet, um nicht-null als wahr und vergessen, dass nicht alle nicht-Nullstellen gleich sind.
: Stell dir vor,
Haben Sie eine Funktion keyPressed() gibt 0 zurück, auf keine Taste gedrückt, Anzahl der Schlüssel, wenn eine Taste gedrückt wird.
Schrieb Sie einen einfachen Schalter in einer Schleife:
Nun Ihre Firma stellt normalerweise öffnen, löst in den Geräten, und Sie brauchen, pref.
Dann bemerken Sie, "erlauben" ist gesetzt falsch...
und plötzlich nur Schlüssel-Nummer 1 funktioniert.
InformationsquelleAutor SF.
Ich lese alle diese Antworten darüber, warum wahre wahr ist, und warum zwei boolean-Variablen, die verglichen werden kann mit
==
oder!=
außer in den seltenen Fällen, in denen eine ganze Zahl ist dazu gezwungen werden, ein boolescher Wert oder so etwas. Aber, ich habe genau das gleiche problem wie der ursprüngliche poster. Ich habe zwei boolean-Variablen, die jeweils "wahr" ist, aber wenn ich Vergleiche, finde ich, dass Sie nicht gleich sind. Hier ist die Codezeile,if (angDegDiff > 15 || scaleRatioA > 5 || scaleRatioB < -5 || (isParallel2 != isParallel1))
{
return false;
}
In meinem Beispiel
angDegDiff = 0
,scaleRatioA = 0
,scaleRatioB = 0
,isParallel2 = true
, undisParallel1 = true
. Immer noch, die Anweisung ausgewertet wirdtrue
und der einzige Weg, das passieren kann, ist, wennisParallel2
ist nicht gleichisParallel1
.Keine Lust Methoden werden verwendet, um die Werte
isParallel1
oderisParallel2
. Ihre Werte werden durch eine Anweisung wie_isParallel = true;
. Später wird dieser Wert kopiert zu anderen Variablen mit einer Anweisung wieisParallel1 = geom1->IsParallel();
umgesetzt wird, wiereturn _isParallel;
.Mein Fazit ist, dass, je nach compiler, zwei boolean-Variablen, die nicht zuverlässig im Vergleich für Gleichheit. Ich bin mit Microsoft Visual C++ 2005, Version 8.0.50727.4039.
Epilog: ich ersetzte die boolean-Vergleich in meinen code mit dem Ausdruck
((isParallel1 && !isParallel2) || (!isParallel1 && isParallel2))
und nun funktioniert alles wunderbar.InformationsquelleAutor Darrell