2016-12-03 6 views
0

これは私のread_double関数です。なぜ私はflush_buff()かその効果を確認する必要がありますか?私は何とかそれを理解することはできません。私は単にflush_buff()を書いてDBL_MINを返すことができませんでしたか?どのように否定!my_function()はCで私の関数に影響を与えますか?

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; 
} 

flush_buff機能:それは改行(\n)またはファイルの終わり(EOF)のいずれかに遭遇するまで

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

BTW 'x> DBL_MAX'は決して真とならない。 – BLUEPIXY

答えて

1

flush_buff()機能は、標準入力から文字を取得します。改行が見つかった場合(EOFではなく)、「真」の値(1に等しい)を返します。

構文はflush_buff()が改行で停止した場合はfalse(ゼロ)になり、ファイルの終わりに達した場合はtrue(1)になります。構文!flush_buff()はこの戻り値を否定します。

statusの値は、浮動小数点値が正常に読み取られた場合は1、浮動小数点値が正常に読み取れなかった場合は0、入力を提供せずに入力ストリームが終了した場合はEOFになります。

statusEOFでない場合は、追加の文字cが入力から読み取られます。これが改行文字でない場合、または指定された数がゼロ以外の正の浮動小数点数の範囲外の場合、入力は無効として扱われます。

この時点で、プログラマは、何らかの理由で、入力ファイルが現在の行で終了する場合はDBL_MINを返し、現在の行が改行文字で終了している場合は​​を返します。この背後にある理由は不明です。

1

!演算子は論理NOT演算子です。ブール値として解釈されるオペランドをとり、反対の値を与えます。ここで、ゼロは偽であり、非ゼロは真です。

この場合、flush_buff関数は、最後の文字がではなく、 EOFである場合に1(つまり真)を返します。したがって、式!flush_buf()は、関数がfalseを返した場合、つまり最後の文字がの場合には EOFと評価されます。

関連する問題