4

我正在网上搜索如何使用scanf的返回值来检查文件的结尾!我找到了以下代码。但是我很难理解?

这种方法是如何工作的?

'~' 运算符是什么意思?

while(~scanf("%d",&n)) { 
  /* Your solution */
}
4

3 回答 3

9

这是一种检查值是否不同于 -1 的可怕方法。~x返回 的按位否定x。因此,请记住用于负数的补充代码(顺便说一下,在大多数编译器上,这种方法甚至不是很便携)-1 由 1-s 的序列表示,因此~(-1)将产生一个零。

请不要使用这种方法。简单的写scanf("%d", &n) != EOF方式更容易理解。

于 2013-04-25T11:55:36.587 回答
2

~是按位 NOT 运算符。因此,这是一种稍微模糊的循环方式,直到scanf返回非 -1 的值。换句话说,

while(~scanf("%d",&n))

相当于

while(scanf("%d",&n) != -1)
于 2013-04-25T11:51:55.920 回答
0

在 C 中,~ 是一个执行按位移位操作的运算符,它创建原始数字的补码。在C中没有布尔类型,0是假的,其他一切都是真的,在你的例子中:

while(~scanf("%d",&n)) { 
  /* Your solution */
}

如果没有更多字符要读取,则 scanf() 返回 EOF,它等于 -1(不是在所有平台上!)所以 -1 由(111... 32 次在 32 位架构中)~EOF = 0 表示,因此有一个您编码的风险不适用于所有平台。

于 2013-04-25T13:22:59.573 回答