【发布时间】:2013-04-19 07:13:19
【问题描述】:
我正在网上搜索如何使用scanf的返回值来检查文件的结尾! 我找到了以下代码。但是我很难理解?
这个方法是如何工作的?
'~' 操作符是什么意思?
while(~scanf("%d",&n)) {
/* Your solution */
}
【问题讨论】:
-
我们不应该使用
fscanf()来读取文件吗?scanf()专门从stdin读取数据嗯?
我正在网上搜索如何使用scanf的返回值来检查文件的结尾! 我找到了以下代码。但是我很难理解?
这个方法是如何工作的?
'~' 操作符是什么意思?
while(~scanf("%d",&n)) {
/* Your solution */
}
【问题讨论】:
fscanf() 来读取文件吗?scanf() 专门从stdin 读取数据嗯?
这是一种检查值是否不同于 -1 的可怕方法。 ~x 返回 x 的按位否定。因此,请记住用于负数的免费代码(顺便说一下,在大多数编译器上,这种方法甚至不是很便携)-1 由 1-s 的序列表示,因此 ~(-1)将产生一个零。
请不要使用这种方法。只需写scanf("%d", &n) != EOF 方式更容易理解。
【讨论】:
scanf("%d", &n) != EOF,-1 is value of EOF on most platform
scanf() 相比,fscanf() 不应该是从文件中读取的正确选择吗?我们可以使用scanf() 从stdin 以外的任何地方读取吗?跨度>
freopen 来重定向标准输入,但是是的,scanf 从stdin 读取。问题是如何根据我的理解检查标准输入中的 EOF(请参阅问题中的代码)。
~ 是按位非运算符。因此,这是一种稍微模糊的循环方式,直到 scanf 返回 -1 以外的值。换句话说,
while(~scanf("%d",&n))
等价于
while(scanf("%d",&n) != -1)
【讨论】:
在 C 中,~ 是一个执行按位移位运算的运算符,它创建原始数字的补码。 在 C 中没有布尔类型,0 是假的,其他一切都是真的,在你的例子中:
while(~scanf("%d",&n)) {
/* Your solution */
}
scanf() 如果没有更多字符要读取,则返回 EOF,它等于 -1(并非在所有平台上!)所以 -1 表示为(在 32 位架构中为 111...32 次)~EOF = 0因此,您的代码可能无法适用于所有平台。
【讨论】: