代码之家  ›  专栏  ›  技术社区  ›  J. Wu

否定如何!my_function()会影响C中的函数吗?

  •  0
  • J. Wu  · 技术社区  · 8 年前

    这是我的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;
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   r3mainer    8 年前

    这个 flush_buff() 函数从stdin中提取字符,直到遇到换行符( \n )或文件结尾( EOF ). 如果发现断线(而不是 EOF ),则返回“真”值(等于1)。

    语法 !flush_buff() 否定此返回值,因此如果 flush_buff() 在换行时停止,如果到达文件结尾,则为true(1)。

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

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

    此时,程序员已经决定了函数应该返回的原因 DBL_MIN DBL_MAX 如果当前行以换行符终止。这背后的原因尚不清楚。

        2
  •  1
  •   dbush    8 年前

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

    在这种情况下 flush_buff 如果读取的最后一个字符为 !flush_buf() EOF。