2016-12-03 2 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 функция:

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

BTW 'x> DBL_MAX' никогда не становится правдой. – BLUEPIXY

ответ

1

flush_buff() Функция считывает символы из стандартного ввода до тех пор, пока не встретится либо разрыв строки (\n) или конец файла (EOF). Если он нашел разрыв строки (а не EOF), тогда он возвращает значение «true» (равное 1).

Синтаксис !flush_buff() отрицает это возвращаемое значение и, таким образом, будет ложным (ноль), если flush_buff() остановлен при разрыве строки или true (1), если конец файла достигнут.

В коде, который вы отправили, значение status будет равно 1, если значение с плавающей запятой было успешно прочитано, 0, если значение с плавающей запятой не может быть успешно прочитано, или EOF, если поток ввода закончился без ввода какого-либо ввода.

Если status не EOF, то дополнительный символ c считывается с ввода. Если это не символ новой строки, или если номер предоставлен вне диапазона положительных ненулевых чисел с плавающей запятой, то вход считается недействительным.

Как этот пункт, программист решил по какой-либо причине, что функция должна возвращать DBL_MIN, если входной файл заканчивается в текущей строке, или DBL_MAX, если текущая строка завершается символом прерывания строки. Обоснование этого неясно.

1

Оператор ! является логическим оператором NOT. Он принимает свой операнд, интерпретируемый как логический, и дает противоположное значение, где ноль false, а ненулевой - истина.

В этом случае функция flush_buff возвращает 1 (т. Е. Истину), если последний прочитанный символ равен не EOF. Таким образом, выражение !flush_buf() оценивает значение true, если функция возвращает false, то есть если последний символ, прочитанный , равен EOF.

Смежные вопросы