2016-12-03 6 views
0

Das ist meine read_double-Funktion. Warum muss ich nach "flush_buff()" suchen oder was bewirkt das? Ich kann es irgendwie nicht herausfinden. Könnte ich nicht einfach flush_buff() schreiben und dann DBL_MIN zurückgeben?Wie wirkt sich die Negation! My_function() auf meine Funktion in C aus?

double read_double(void) { 
    double x; 
    int c, status; 

    printf("Insert double: "); 
    status = scanf("%lf", &x); 
    if (status == EOF || (c = getchar()) == EOF) { 
     return DBL_MIN; 
    } 
    if (status != 1 || c != '\n' || x < DBL_MIN) { 
     if (!flush_buff()) { /*What is the purpose of this?*/ 
      return DBL_MIN; 
     } 
     return DBL_MAX; 
    } 
    return x; 
} 

Die flush_buff Funktion:

int flush_buff(void) { 
    int c; 
    while ((c = getchar()) != '\n' && c != EOF) {} 
    return c != EOF; 
} 
+2

BTW 'x> DBL_MAX' werden nie wahr. – BLUEPIXY

Antwort

1

Die flush_buff() Funktion holt Zeichen von stdin bis er entweder einen Zeilenumbruch (\n) oder am Ende der Datei (EOF) trifft. Wenn es einen Zeilenumbruch (und nicht EOF) gefunden hat, gibt es einen "wahren" Wert (gleich 1) zurück.

Die Syntax !flush_buff() negiert diesen Rückgabewert und ist daher false (null), wenn flush_buff() bei einem Zeilenumbruch angehalten wurde, oder true (1), wenn das Dateiende erreicht wurde.

Im Code, den Sie geschrieben, wird der Wert von status 1 sein, wenn ein Wert Gleitkomma erfolgreich gelesen wurde, 0, wenn ein Gleitkommawert nicht erfolgreich sein könnte, oder EOF, wenn der Eingangsstrom beendet, ohne eine Eingabe bereitstellt lesen.

Wenn status nicht EOF ist, wird ein zusätzliches Zeichen c vom Eingang gelesen. Wenn dies kein Newline-Zeichen ist oder wenn die angegebene Zahl außerhalb des Bereichs positiver Gleitkommazahlen ungleich Null liegt, wird die Eingabe als ungültig behandelt.

Als dieser Punkt hat der Programmierer - aus welchen Gründen auch immer - entschieden, dass die Funktion DBL_MIN zurückgeben soll, wenn die Eingabedatei an der aktuellen Zeile endet, oder DBL_MAX, wenn die aktuelle Zeile durch ein Zeilenumbruchzeichen beendet wird. Die Begründung dafür ist unklar.

1

Der Operator ! ist der logische Operator NOT. Der Operand wird als Boolesch interpretiert und gibt den entgegengesetzten Wert an, wobei Null falsch und Nicht-Null wahr ist.

In diesem Fall gibt die flush_buff-Funktion 1 (d. H. Wahr) zurück, wenn das letzte gelesene Zeichen nicht EOF ist. Daher wird der Ausdruck !flush_buf() als wahr ausgewertet, wenn die Funktion falsch zurückgegeben wurde, d. H. Wenn das letzte gelesene Zeichen EOF ist.

Verwandte Themen