Bekommen negative Zahlen in C / C ++ den Wert false?
Beim auswerten ganze zahlen als Boolesche Werte in C/C++, sind negative zahlen true oder false? Sind Sie immer true/false unabhängig von Compilern?
Kommentar zu dem Problem - Öffnen
Alles, was nicht null ist true.
Wie sehen Sie aus den nachfolgenden Antworten zitieren aus verschiedenen Normen, C und C++ sind nicht die gleiche Sprache.
warum versuchst du nicht dich selbst?
, wenn(-1) cout << "true" << endl;
@JackCColeman: wie macht die Ente falsch, genau? Er sagt, alles, was nicht null ist wahr; -1 ist nicht null, und so -1 gilt. Dies scheint zu überraschen, Sie für einige Grund, aber es ist genau das, was die Ente sagte, und auch, was Brendan Programm sagt.
... Ich erinnere mich an BASIC-interpreter gespeichert ist "true" als -1. Ich denke, das ist, wo Fragen wie diese kommen.
InformationsquelleAutor der Frage Jason Maldonado | 2013-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Alle nicht-null-Werte werden in
true
, und null-Werte zufalse
. Mit negativen zahlen, die nicht null ist, wird Sie konvertiert werden, umtrue
.Zitat aus dem standard C++11 (Hervorhebung von mir):
Erhalten Sie nur die oben genannten Garantie, wenn dein compiler ist Standard-konform, oder zumindest entspricht, die mit diesem spezifischen Teil der Norm. In der Praxis werden alle Compiler haben dieses standard-Verhalten, also gibt es nicht viel zu befürchten.
InformationsquelleAutor der Antwort Mark Garcia
Können Sie testen Sie es selbst compilieren Sie diese:
Ergebnisse:
Natürlich eine Antwort auf den zweiten Teil Ihrer Frage, "Sind Sie immer true/false unabhängig von Compilern?", der einzige Weg um ganz sicher zu sein ist der Blick auf das spec. Im Allgemeinen jedoch, Compiler warnt Sie, wenn Sie etwas tun, gefährlich, und Sie können sehen, aus der obigen Ausgabe, dass Sie auch mit "pedantisch" Warnungen,
gcc
Auffassung dieser code völlig in Ordnung.InformationsquelleAutor der Antwort Brendan Long
Kurze Antwort: ja, die negativen Werte, und alle nicht-null-Werte im Allgemeinen, werden als true behandelt, wenn Sie als Bedingungen.
C, gibt es eine Reihe von Kontexten, in denen ein Ausdruck behandelt wird als ein Zustand. Die Bedingungen sind nicht unbedingt der Typ
bool
oder_Bool
; diese Art wurde nur Hinzugefügt, um die Sprache durch die 1999 standard.Die offensichtlichste von diesen zusammenhängen ist der Ausdruck in einer
if
Aussage, aber es gibt auch andere Beispiele:while
,do-while
, der zweite Ausdruck in einerfor
header, der erste operand des?:
bedingte operator und den operand(s) der!
,&&
, und||
Betreiber. (Ich denke, dass eine erschöpfende Liste, aber ich bin mir nicht sicher.)Hier ist, was der C-standard sagt über das Verhalten der
if
Aussage ("zwei Formen" beziehen sich aufif
mit und ohneelse
- Klausel):Was bedeutet, dass diese:
ist äquivalent zu:
(hinzufügen von zusätzlichen Klammern zu vermeiden Rangfolge der Probleme). Die Bedeutung wird klar, wenn
foo
ist der Typint
. Wennfoo
ist eine floating-point-Typ0
ist Umgerechnet auf den gleichen Typ (die können dazu führen, dass einige Feinheiten, wenn der Wert passiert, um eine negative null oder NaN). Und wennfoo
ist ein Zeiger, ein0
behandelt wird wie ein null-Zeiger-Konstante;if (ptr)
entsprichtif (ptr != NULL)
(vorausgesetzt, die definition vonNULL
sichtbar ist).Für C++, die Regeln sind erklärt etwas anders, aber der Effekt ist der gleiche. Die Bedingung in C++
if
- Anweisung konvertiert wird, geben Siebool
(anders als in C, die Artbool
gebaut wurde, in C++ seit der früh-Geschichte). Die Konvertierung eines Wertes jeder Skalare Typbool
definiert ist durch den C++ - standard:So, in C und C++, Skalare (d.h., integer -, Fließkomma-oder Zeiger -) Wert kann verwendet werden, als eine Bedingung, und die Bedingung ist falsch, wenn die Skalare gleich null ist, und true, wenn es nicht gleich null ist. C definiert diese als Ungleichheit Vergleich zu
0
; C++ definiert es als eine Umstellung auf dasbool
- aber das Ergebnis ist das gleiche.Das wird jetzt ein bisschen off topic die Frage, aber ich werde erwähnen, dass es wichtig ist zu beachten, dass ein Wert, der behandelt wird, als eine echte Bedingung ist nicht unbedingt gleich zu
true
.true
(das ist1
in C, wenn Sie#include <stdbool.h>
, und einen eindeutigen Wert vom Typbool
in C++) ist nur einer von vielen Werten, die über "truthiness" als in einer Bedingung verwendet. Das ist, warum Sie sollten fast nie schreiben:entweder in C oder C++ (es sei denn, Sie wirklich brauchen, um zu vergleichen, dass ein Wert); schreiben Sie einfach:
Einem C++ - Beispiel:
Ausgabe:
InformationsquelleAutor der Antwort Keith Thompson
Alles, was nicht
0
umgewandelt werdentrue
(1 im Fall von C)zero
Wert konvertiert wird, umfalse
(0 im Fall C). Mit Bezug auf C wenn wir uns die C99-standard-Entwurf Abschnitt6.3.1.2
Typ Boolean Absatz 1 sagt:Vollständigkeit halber, wenn wir uns an Abschnitt
7.16
Typ Boolean und Werte Absatz 2 sagt:Bezug auf C++ die Entwurf der C++ - standard in Abschnitt
4.12
boolsche Konvertierungen Absatz 1 sagt(Hervorhebung von mir):Diese halten sollte, unabhängig davon, welchen compiler Sie verwenden.
InformationsquelleAutor der Antwort Shafik Yaghmour
Gute Frage. Die Antwort ist "hängt".
Auf der anderen Seite, angenommen, Sie sind auf einem 16-bit-Maschine:
Auf der anderen Seite,
Also negative zahlen sind nicht immer falsch, außer manchmal Sie immer sind.
InformationsquelleAutor der Antwort DanielV