negation!my_function()如何在C中影响我的函数?

问题描述:

这是我的read_double函数。为什么我必须检查!flush_buff()或其效果是什么?我以某种方式无法弄清楚。我不能只写flush_buff(),然后返回DBL_MIN?negation!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功能:

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

BTW'x> DBL_MAX'永远不会成真。 – BLUEPIXY

flush_buff()函数从stdin提取字符,直到它遇到任一个换行(\n)或文件(EOF)的端部。如果发现换行符(而不是EOF),则返回一个“true”值(等于1)。

语法!flush_buff()否定此返回值,因此如果flush_buff()在换行符处停止,则将为false(零),如果已达到文件末尾,则为true(1)。

在您发布的代码中,如果成功读取浮点值,则status的值将为1,如果无法成功读取浮点值,则值为0,如果输入流在未提供任何输入的情况下结束,则值为EOF

如果status不是EOF,则从输入读取附加字符c。如果这不是换行符,或者提供的数字超出了正数非零浮点数的范围,则输入被视为无效。

就这一点而言,程序员决定 - 无论出于何种原因 - 如果输入文件在当前行结束,函数应该返回DBL_MIN;如果当前行由换行符终止,则该函数应该返回​​。背后的原因尚不清楚。

!运算符是逻辑NOT运算符。它将操作数解释为布尔值并给出相反的值,其中零为假且非零为真。

在这种情况下,如果读取的最后一个字符是而不是 EOF,则flush_buff函数返回1(即为真)。因此,如果函数返回false,即如果最后读取的字符 EOF,则表达式!flush_buf()的计算结果为真。