Das Programm hat einen logischen Fehler - weniger als zwei Nummern eingeben und den Strom schließen würde das Programm in eine Endlosschleife machen. Wenn Sie den Stream bei der ersten Iteration schließen, erhalten Sie auch ein undefiniertes Verhalten, da a
oder b
vor dem Schreiben gelesen werden.
Der Grund dafür ist, dass comma ,
operator verwirft das Ergebnis seiner ersten Operanden Bewertung:
while (scanf("%d %d", &a, &b), (a || b))
scanf("%d %d", &a, &b)
nennen, und gehen Sie a || b
unabhängig vom Ergebnis zu bewerten. Das ist falsch, weil scanf
eine Anzeige zurückgeben kann, dass der Stream beendet wurde, bevor zwei Ganzzahlen gelesen werden.
Eine bessere Möglichkeit, dieses Programm zu schreiben, ist wie folgt:
while ((scanf("%d %d", &a, &b) == 2) && (a || b))
Dies auch intuitiver ist, weil &&
als Komma besser abhebt.
Anmerkung:a || b
bedeutet dasselbe wie a != 0 || b != 0
, das heißt, dass mindestens einer der a
b
oder ungleich Null ist.
C und C++ sind verschiedene Sprachen, so markieren Sie bitte Ihre Frage richtig –
Die 'a || b 'ist die Schleifensteuerung, aber das Programm kann die wesentliche Überprüfung des Rückgabewerts von' scanf 'nicht durchführen. –
Ja, ich weiß, C und C++ sind verschiedene Sprachen, aber die Frage, die ich gestellt habe, ist beiden gemeinsam – vishal