我正在网上搜索如何使用scanf的返回值来检查文件的结尾!我找到了以下代码。但是我很难理解?
这种方法是如何工作的?
'~' 运算符是什么意思?
while(~scanf("%d",&n)) {
/* Your solution */
}
这是一种检查值是否不同于 -1 的可怕方法。~x
返回 的按位否定x
。因此,请记住用于负数的补充代码(顺便说一下,在大多数编译器上,这种方法甚至不是很便携)-1 由 1-s 的序列表示,因此~(-1)
将产生一个零。
请不要使用这种方法。简单的写scanf("%d", &n) != EOF
方式更容易理解。
~
是按位 NOT 运算符。因此,这是一种稍微模糊的循环方式,直到scanf
返回非 -1 的值。换句话说,
while(~scanf("%d",&n))
相当于
while(scanf("%d",&n) != -1)
在 C 中,~ 是一个执行按位移位操作的运算符,它创建原始数字的补码。在C中没有布尔类型,0是假的,其他一切都是真的,在你的例子中:
while(~scanf("%d",&n)) {
/* Your solution */
}
如果没有更多字符要读取,则 scanf() 返回 EOF,它等于 -1(不是在所有平台上!)所以 -1 由(111... 32 次在 32 位架构中)~EOF = 0 表示,因此有一个您编码的风险不适用于所有平台。