【问题标题】:How does the negation !my_function() effect my function in C?否定 !my_function() 如何影响我在 C 中的函数?
【发布时间】:2016-12-03 22:09:44
【问题描述】:

这是我的 read_double 函数。为什么我必须检查 !flush_buff() 或它的作用是什么?我不知何故无法弄清楚。我不能只写flush_buff()然后返回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;
}

【问题讨论】:

  • 顺便说一句 x &gt; DBL_MAX 永远不会成为现实。

标签: c buffer eof flush negation


【解决方案1】:

flush_buff() 函数从标准输入获取字符,直到遇到换行符 (\n) 或文件结尾 (EOF)。如果它发现了一个换行符(而不是EOF),那么它返回一个“真”值(等于1)。

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 2017-03-28
      • 1970-01-01
      相关资源
      最近更新 更多