Ihr zweites Beispiel hat ein anderes Verhalten als das erste, und hat einen Bug.
Wenn die Codezeile:
fgets(str, 100, stdin);
schlägt fehl, da es sich um eine Lese am Ende der Datei war, dann wird der Rest des Blocks ausgeführt werden.
Im ersten Satz von Code tritt der feof()
Test nach dem fgets()
auf, der die EOF-Bedingung verursacht, so dass der while()
-Block nicht ausgeführt wird.
Da fgets()
NULL, wenn es EOF getroffen hat (und alle Daten in den Puffer nicht gelesen hat), könnte ich die Schleife Code wie:
while (fgets(str, 100, stdin)) {
printf("> ");
// ...
}
die noch etwas anderes Verhalten ist (da sein ein weniger ">" gedruckt). Wenn das wichtig wäre, würde ich eine extra Instanz von printf()
vor die Schleife legen.
Im Allgemeinen, da es dazu neigt, Verwirrung zu verursachen, würde ich den Komma-Operator vermeiden, außer dort, wo es wirklich, wirklich benötigt wird oder wo es keine Verwirrung verursacht. Zum Beispiel wird es manchmal in for
Loop-Klauseln in einer nicht-verwirrenden Weise verwendet, um zu ermöglichen, dass mehrere Variablen bei jeder Schleifeniteration aktualisiert werden.
die Schleife geschrieben Eigentlich ohne die Verarbeitung der Linie beenden wird 'fgets' beenden von EOF Empfang statt von einem Newline erhalten. Dies führt dazu, dass die Schleife eine letzte Zeile ignoriert, die nicht in einer neuen Zeile endet, was möglicherweise das gewünschte Verhalten ist, aber eher ein Fehler. –
@R .: Ich erinnere mich an die Beobachtung von http://www.drpaulcarter.com/cs/common-cerrerrs.php#4.2: "Der Autor hat noch nicht gesehen, dass ein Schüler die Funktion feof() benutzt korrekt!" –