Mit scanf in eine while-Schleife
Wohl eine sehr einfache Antwort auf diese sehr einfache Frage:
Lese ich "C Primer Plus" Pratta und er hält sich am Beispiel
while (scanf("%d", &num) == 1)...
Ist der = = - 1 ist wirklich notwendig? Wie es scheint, könnte man einfach schreiben:
while (scanf("%d", &num))
Scheint es, wie die Geschlechter-test ist überflüssig, da scanf gibt die Anzahl der Objekte Lesen und 1 würde die while-Schleife wahr. Ist der Grund, um sicherzustellen, dass die Anzahl der Elemente Lesen ist genau 1, oder ist dies völlig überflüssig ist?
Ja, sieht ziemlich überflüssig für mich...
InformationsquelleAutor Tyler Brock | 2010-06-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C bei 0 wird ausgewertet zu false und alles andere true. Also, wenn scanf EOF zurückgegeben, ist ein negativer Wert, würde die Schleife zu true ausgewertet werden, das ist nicht das, was Sie wollen.
InformationsquelleAutor JRL
Seit
scanf
liefert den Wert EOF (-1) auf das Ende der Datei, wird die Schleife wie geschrieben korrekt ist. Es läuft solange wie das Eingabe-text enthält, entspricht%d
, und hält entweder auf das erste Spiel oder nicht-das Ende der Datei.Wäre es gewesen, deutlicher auf einen Blick, ob
scanf
erwarten, wurden mehr als einen Eingang....würde beenden die Schleife, wenn die erste Zeit war es nicht passen zwei Werte, entweder durch das Ende der Datei Ende der Datei (
scanf
gibt EOF (-1)) oder an den input-matching-Fehler (z.B. die Eingabexyzzy 42
entspricht nicht%d %d
soscanf
Stoppt beim ersten Fehler, und gibt 0 zurück ohne das schreiben entwederx
odery
), wenn es gibt einige Wert weniger als 2.Natürlich
scanf
ist nicht Ihrem Freund beim Parsen des echten Eingang von normalen Menschen. Es gibt viele Fallstricke in die Behandlung von fehlerfällen.Edit: einen Fehler Behoben:
scanf
zurückEOF
auf das Ende der Datei oder eine nicht-negative ganze Zahl-zählen die Anzahl der Variablen, die es erfolgreich gesetzt.Der entscheidende Punkt ist, dass da alle nicht-null-Wert ist
TRUE
in C, ohne zu testen, den Rückgabewert korrekt in einer Schleife wie diese können leicht zu unerwartetem Verhalten führen. Insbesonderewhile(scanf(...))
ist eine Endlosschleife, es sei denn, es trifft auf die Eingabe von text, der nicht konvertiert werden kann, nach dessen format.Und ich kann nicht stark genug betonen, dass
scanf
ist nicht Ihrem Freund. Eine Kombination vonfgets
undsscanf
könnte genug für einige einfache Analyse, aber auch dann ist es leicht überwältigt von edge-Fällen und Fehlern.InformationsquelleAutor RBerteig
Verstand man den C-code korrekt.
Manchmal ist der Grund für die Prüfung die Anzahl der Elemente Lesen ist, dass jemand will, um sicherzustellen, dass alle Artikel, die gelesen wurden, anstelle von scanf beenden früh, wenn Sie die Eingabe nicht mit der erwarteten Typ. In diesem besonderen Fall ist es egal.
In der Regel scanf ist eine schlechte Wahl von Funktionen, weil es nicht die Bedürfnisse der interaktiven Eingaben von einem menschlichen Benutzer. In der Regel eine Kombination von fgets und sscanf liefern bessere Ergebnisse. In diesem besonderen Fall ist es egal.
Wenn in späteren Kapiteln erklären, warum einige Arten von Codierungsverfahren sind besser als dieses triviale Beispiel, gut. Aber wenn nicht, sollten Sie dump das Buch, das Sie gerade Lesen.
Auf der anderen Seite, Ihren Ersatz-code ist nicht wirklich ein Ersatz. Wenn scanf gibt -1 zurück, dann deine while-Schleife ausgeführt wird.
"Falsch, siehe die anderen Antworten." -- du meinst falsch, siehe meine eigene Antwort, weil das ist, warum ich schrieb "Wenn scanf gibt -1 zurück, dann deine while-Schleife wird ausgeführt."
InformationsquelleAutor Windows programmer
Während Sie korrekt sind, ist es nicht unbedingt erforderlich ist, einige Leute es vorziehen, aus mehreren Gründen.
Ersten, durch den Vergleich zu 1 wird es einer expliziten booleschen Wert (true oder false). Ohne den Vergleich, den Sie testen auf eine Ganzzahl, die gültig ist in C, aber nicht in späteren Sprachen (wie C#).
Zweitens, einige Leute Lesen würden, die zweite version in Bezug auf while([Funktion]), anstelle von, während([return-Wert]), und im Moment verwirrt, indem Sie eine Funktion testen, wenn das, was offenbar gemeint ist die Prüfung der Rückgabewert.
Dies kann völlig eine Sache der persönlichen Präferenz, und so weit ich bin besorgt, beide sind gültig.
InformationsquelleAutor abelenky
Könnte vllt schreiben Sie es ohne einen expliziten Vergleich (siehe JRL Antwort, obwohl), aber warum sollte man? Ich würde sagen, dass Vergleich-weniger Bedingungen sollten nur verwendet werden, mit Werten, die explizit Boolesche Semantik (wie ein
isdigit()
nennen, zum Beispiel). Alles andere sollte auf die Verwendung einer expliziten Vergleich. In diesem Fall (das Ergebnisscanf
) die Semantik ist augenscheinlich nicht-boolescher Wert, also der explizite Vergleich ist in Ordnung.Auch, den Vergleich kann man in der Regel weglassen ist in der Regel ein Vergleich mit null. Wenn Sie den Drang verspüren, das weglassen der Vergleich mit etwas anderem (wie
1
in diesem Fall) ist es besser, denken Sie zweimal, und stellen Sie sicher, Sie wissen, was Ihr tut (siehe die JRL Antwort wieder).In jedem Fall, wenn der Vergleich sicher sein kann, ausgelassen und man tatsächlich weglassen, die eigentliche semantische Bedeutung der Zustand bleibt der gleiche. Es hat absolut keine Auswirkungen auf die Effizienz der resultierende code, wenn das ist etwas, das Sie sich Gedanken darüber.
InformationsquelleAutor AnT