这是我的 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;
}
最佳答案
flush_buff()
函数从 stdin 获取字符,直到遇到换行符 (\n
) 或文件结尾 (EOF
).如果它发现一个换行符(而不是 EOF
),那么它返回一个“真”值(等于 1)。
语法 !flush_buff()
否定此返回值,因此如果 flush_buff()
在换行处停止,则为假(零),或为真(1 ) 如果已到达文件末尾。
在您发布的代码中,如果成功读取浮点值,则 status
的值为 1,如果无法成功读取浮点值,则为 0,或者 EOF
如果输入流在没有提供任何输入的情况下结束。
如果status
不是EOF
,则从输入中读取一个附加字符c
。如果这不是换行符,或者如果提供的数字超出正非零 float 的范围,则输入被视为无效。
此时,程序员已经决定——无论出于何种原因——如果输入文件在当前行结束,函数应该返回 DBL_MIN
,如果当前行以换行符终止。这背后的原因尚不清楚。
关于c - 否定 !my_function() 如何影响我在 C 中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40953030/