否定 !my_function() 如何影响我在 C 中的功能?

How does the negation !my_function() effect my function in C?

这是我的 read_double 函数。为什么我必须检查 !flush_buff() 或者它的作用是什么?我不知何故无法弄清楚。我不能只写 flush_buff() 然后 return DBL_MIN 吗?

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

flush_buff() 函数从标准输入中获取字符,直到遇到换行符 (\n) 或文件结尾 (EOF)。如果它找到一个换行符(而不是 EOF),那么它 return 是一个 "true" 值(等于 1)。

语法 !flush_buff() 否定此 return 值,因此如果 flush_buff() 在换行处停止则为假(零),如果结束则为真(1)已到达文件。

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

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

此时,程序员已经决定——无论出于何种原因——函数应该 return DBL_MIN 如果输入文件在当前行结束,或者 DBL_MAX 如果当前行以换行符终止。这背后的原因尚不清楚。

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

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