while(foo) vs while(foo != NULL)
Kann mir jemand erklären, wie while(foo)
vs while(foo != NULL)
sind äquivalent? Auch:
while(!foo)
vs while(foo == NULL)
Weiß ich das ! ist es nicht, aber das ist alles, was ich weiß.
- Wenn
foo
ist ein Zeiger, dann ist die definition vonwhile(foo)
istwhile(foo != NULL)
. Daher sind Sie gleichwertig. - Mögliche Duplikate von Kann ich, wenn (Zeiger) anstelle von if (Zeiger != NULL)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vorausgesetzt
foo
ist vom Typ Zeiger,while (foo)
undwhile (foo != NULL)
sind genau gleichwertig. Beide sind auch gleichwertigwhile (foo != 0)
. (Meiner Meinung nachwhile (foo != NULL)
deutlicher drückt die Absicht.)In jedem Kontext erfordern eine Bedingung (
if()
,while()
ein paar andere), wird der Ausdruck so behandelt, als wahr, wenn die Bedingung vergleicht ungleich null, false wenn es vergleicht gleich null.NULL
ist ein makro, das expandiert, um eine von der Implementierung definierte null-Zeiger-Konstante. Vergleicht man einen Zeiger-Wert, umNULL
liefert ein true-Wert für einen null-Zeiger, die einen false-Wert für alle nicht-null-Zeiger.Die ständige
0
ist eine null-Zeiger-Konstante [*]. (Dies bedeutet nicht, dass eine null-Zeiger hat die gleiche bit-Darstellung0x00000000
oder etwas ähnliches, obwohl es oft nicht, es bedeutet, dass eine Konstante0
im source-code kann bezeichnen einen null-Zeiger.) Wie man erwarten würde, in der eine Zeiger-Wert, um eine null-Zeiger-Konstante sagt Ihnen, ob dieser Zeiger ist ein null-Zeiger oder nicht. Inwhile (foo)
dem Vergleich auf null ist implizit-aber es prüft weiterhin, obfoo
ist ein null-Zeiger oder nicht.Generell
while (foo)
vergleichtfoo
zu0
entspricht den Vergleich mit "null" des entsprechenden Typs.while (foo)
ist immer äquivalent zuwhile (foo != 0)
. Für eine floating-point-Wert, ist es auch gleichwertig zuwhile (foo != 0.0)
. Für ein Zeichen, es ist äquivalent zuwhile (foo != '\0')
. Und, wie wir gesehen haben, für einen Zeiger-Wert, es ist gleichbedeutendwhile (foo != NULL)
.(In C, ein Vergleichsoperator bringt immer eine
int
Wert von0
wenn die Bedingung false ist, wird1
wenn es wahr ist-aber alle nicht-null-Wert wird als true behandelt, über die implizite Ungleichheit Vergleich auf null.)[*] Ein null-Zeiger-Konstante ist definiert als ganzzahliger konstanter Ausdruck mit dem Wert
0
oder solchen Ausdrucks werfen, umvoid*
. Eine null-Zeiger-Konstante ist nicht notwendigerweise vom Typ Zeiger, aber konvertieren es zu Zeigertyp liefert einen null-Zeiger-Wert. Vergleicht man einen Zeiger-Wert, um0
Ursachen der0
werden implizit in den Typ Zeiger, damit der Vergleich durchgeführt werden kann.0
ist sowohl ein Ausdruck vom Typint
und eine null-Zeiger-Konstante, die ich sehen kann, das könnte zu Verwirrung führen.)#define NULL 0
kann gültig sein, so können#define NULL ((void*)0)
. Letzteres hat Vorteile, aber beide sind kompatibel.#define NULL ((void*)0)
ist nicht gültig. (N1570 6.5.1p5 nicht sagen, dass eine eingeklammerte null-Zeiger-Konstante ist eine null-Zeiger-Konstante.) Aber in der Praxis ist es sicherlich beabsichtigt, um gültig zu sein.und
Äquivalent sind, weil einfach die NULL ist ein makro, das expandiert, um entweder
0
oder(void*)0
oder0L
angesichts der Tatsache, dass in C 0 zu false ausgewertet wird(und alle nicht-null-Nummer auf true), dannfoo
. Betrachtendouble foo
.while(foo);
ist OK, aberwhile(foo != NULL)
nicht kompilieren: "ungültige Operanden für binäres!=
" je nachdem, wieNULL
definiert ist, was eine null-Zeiger-Konstanten und nicht0
wie hier vorgeschlagen.foo
ist entweder ein Zeiger oder einint
jedochNULL
ist gewährleistet, um vergleichen gleich 0 ist, in der Praxis denke ich, dass die meisten Implementierungen verwenden Sie 0 alsNULL
.#define NULL ((void *)0)
. MS Visual 2010, beim kompilieren alsC
verwendet#define NULL ((void *)0)
. Vielleicht sind Sie denken, wieNULL
definiert ist, in einer anderen Sprache wieC++
.NULL
werden kann(void*)0
, aber nicht0
noch0L
. Ihre Antwort heißt es, es könnte sein0, or (void*)0 or 0L
. Ihr Kommentar "die meisten Implementierungen verwenden Sie 0 alsNULL
", ist nicht gesichert, indem jedes Beispiel, das gegen 2 Gegenbeispiele gegeben.NULL
kann entweder0
oder(void *)0
- ich stehe korrigiert.NULL
ist ein symbolische Konstante, Sie können denken, es als eine Art Ersatz-text.NULL
ist nur etwas, dass der compiler später ersetzt mit einer null, so schreibenwhile (foo != NULL)
ist das gleiche wie das schreibenwhile (foo != 0)
. Denken Sie daran,==
sagt ja wenn was Links von ihm ist gleich, was ist auf der rechten Seite, in der Erwägung, dass!=
sagt ja, wenn was ist Links NICHT gleich ist, was auf der rechten Seite.In C die Zahl 0 bedeutet immer false und jeder andere Wert bedeutet true. So
while (foo != 0)
ist die gleiche wie zu sagen "Führen Sie den code in diese Schleife, während foo ist wahr".while (1)
, zum Beispiel, ist die gleiche wie zu sagen "Führen Sie den code in diese Schleife ewig", denn 1 ist eine Zahl, die immer von null Verschieden ist und somit immer true.In C, wenn Sie nur
foo
wo eine true-oder-false-Wert erwartet wird, ist das gleiche wie sagenfoo != 0
, das ist ein bisschen wie eine Verknüpfung, die Sie verwenden können, ist es das gleiche wie die Frage: "ist foo wahr?".!
bedeutet "nicht", so fragt!foo
ist die gleiche wie die Frage: "ist foo NICHT wahr?", in anderen Worten, "foo ist falsch?". Dies bedeutet, dasswhile (!foo)
ist das gleiche wie "Führen Sie den code in diese Schleife, während foo ist falsch", das ist das gleiche wiewhile (foo == 0)
da null bedeutet false, ist das gleiche wiewhile (foo == NULL)
seitNULL
Mittel null.Betrachten Sie es so: den code in eine Schleife wird nur ausgeführt, wenn das, was in der Klammer wahr ist (nicht null). So in
while (foo)
der computer wird Sie Fragen "foo ist non-zero?", wenn ja wird die Schleife immer weiter. Nun, wenn Sie habenwhile (!foo)
, der computer wird Sie Fragen "ist foo NICHT-null?", wenn ja wird die Schleife immer weiter. Die Schleife wird nur beendet, wenn der Ausdruck in der Klammer false ergibt.NULL
definiert ist, die in mehreren standard-header-Dateien, es ist nicht ein Schlagwort wieif
undwhile
, müssen Sie eine header-Datei definiert wird es in der Lage sein, es zu benutzen. Die Idee ist, dass, wenn ein Zeiger die Adresse null, spricht man von einem "null-Zeiger", das ist, warum es heißtNULL
es verwendet, wenn man sagen will "null-Adresse" statt einfach nur "null-Nummer".Edit:
Wie richtig angemerkt Matt McNabb,
NULL
können definiert werden als0
oder als(void *)0
. Klar bleiben Sie irgendwelche Zweifel haben, zitiere ich den C11-standard:Und später auf
Dann in Abschnitt 7.19:
Und der text geht weiter. So
(void *)0
und0
sind gültig der Implementierung definierte null-Zeiger-Konstanten.NULL
kann entweder0
oder(void *)0
.NULL
werden0
? Wie ich gelesen habe C-specNULL
ist eine "null pointer constant".0
ist einint
. Vielleicht gleichen Wert, aber unterschiedlicher Typen und Größen.null pointer constan
t auf eine integer-Konstante, gleich null ist oder der gleichen Besetzung zuvoid*
.NULL
es erforderlich, obwohl zur Behandlung der integer0
alsNULL
wenn in einem pointer-Kontext".0
alsNULL
" im "Zeiger-Kontext", das heißt aber nicht "definiertnull pointer constant
(NULL
) wird ein integer-Konstante" in Ihrem früheren Kommentar. Um klar zu sein,NULL
hat nicht nur einen Wert, sondern ein Typ. Wie lese ich die C-spec,, die Art ist einige Zeiger und0
ist kein Zeiger."An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant"
=="defines null pointer constant on being an integer constant that equals zero or the same cast to void*"
, zumindest für mich.NULL
kann entweder0
oder(void *)0
.while (
expression
) wiederholt den umschließenden block, solangeexpression
ergibt alle nicht-null-Wert. Wennexpression
evalutes 0 erreicht, wird die while-Schleife endet.Einer
expression
das ist ein pointer-Typ ist als nicht-0, wenn der Zeiger-Wert ist nichtstd::nullptr
oderNULL
.Den
!
operator ist ein booleschernot
Betreiber.Daher
Und
sind logisch äquivalent zu einander. Daher die logische Umkehrung der beiden sind ebenfalls äquivalent zu einander.
std::nullptr
ist eine c++ - Ding. Wir sind in eine [c] Frage.einer while-Schleife laufen können, etwa so:
NULL
ist wie 0 ist, also wenn Siewhile(foo != NULL)
dies ist zu sagen, dass while(foo ist nicht gleich 0, also, während es ist gleich 1 oder etwas anderes) ausführen.