否定 !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.
这是我的 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.