2016-06-25 10 views
-2

Meine Frage, die in dem unten stehenden Programm ist, wie funktioniert der Code, wie das funktioniert: while (scanf ("% d% d", & a & b), (a || b))

while (scanf("%d %d", &a, &b), (a || b)) 

wird evaluiert?

Das Programm zwei Nummern erhalten und die Summe drucken:

int a, b; 
while (scanf("%d %d", &a, &b), (a || b)) 
    printf("%d\n", a + b); 
+0

C und C++ sind verschiedene Sprachen, so markieren Sie bitte Ihre Frage richtig –

+3

Die 'a || b 'ist die Schleifensteuerung, aber das Programm kann die wesentliche Überprüfung des Rückgabewerts von' scanf 'nicht durchführen. –

+0

Ja, ich weiß, C und C++ sind verschiedene Sprachen, aber die Frage, die ich gestellt habe, ist beiden gemeinsam – vishal

Antwort

1

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 ab oder ungleich Null ist.

2

mehr Dokumentation Lesen Sie mehr über C und seine standard library.

Beginnen Sie mit dem Lesen sorgfältig die Dokumentation von scanf.

Lasen Sie dann über die comma operator, und die logical operators (z || und &&)

Auch Ihren Code mit allen Warnungen & Debug-Informationen (gcc -Wall -g) kompilieren und es Schritt im Debugger (gdb) Schritt ausgeführt werden. Das würde Ihnen eine (teilweise) Intuition darüber geben, wie Ihr Computer Ihren Code ausführt.

Vergessen Sie nicht, über undefined behavior zu lesen, insbesondere C.Lattner's Blog: What every C programmer should know about undefined behavior.

könnte eine bessere Code sein:

int a, b; 
while ((a=b=0), (scanf("%d %d", &a, &b)==2) && (a || b)) 
    printf("%d\n", a + b); 
0

, wie es läuft:
, wenn der Benutzer zwei ganzen Zahlen eingibt wird es Summe dieser beiden Zahlen drucken,
und fragen Sie nach zwei nächsten Eingabe, bis der Benutzer zwei Null ganze Zahlen eingibt,
und wenn Benutzer gibt nicht ganzzahligen Wert wie aaa es wird vorherige a+b Wert und Schleifen für immer ohne neue Eingabe drucken!

damit ist fehlerhafter Code:

  1. versucht so einfach wie möglich zu schreiben (es gibt keinen Punkt C-Anweisungen in Kombination)
  2. immer auf Fehler überprüfen
  3. Verwendung systemunabhängige Typen wie int32_t von #include<stdint.h> wenn
  4. benötigt Variablen
initialisieren

meine empfohlene Beispiel:

#include<stdint.h> 
#include<stdio.h> 
int main() 
{ 
    int32_t a, b; 
    do{ 
     if (scanf("%d%d", &a, &b) != 2) { 
      printf("incorrect input\n"); 
      return 1; 
     } 
     printf("%d + %d = %d\n", a, b, a + b); 

    } while (a || b); 
    return 0; 
} 

Terminal-Ausgang (+ Eingang):

10 
20 
10 + 20 = 30 
0 
0 
0 + 0 = 0 
Verwandte Themen