由while(scanf("%d",&n)!=EOF)引出的小问题
说实话,以前没见过这种写法,没注意scanf还有返回值,EOF也没怎么见过。百度了一番,知道EOF是-1(即#define EOF (-1));scanf返回的是成功扫描进的数的个数。如scanf("%d %d",&a, &b),若a、b都输入成功返回2,成功一个返回1,都不成功返回0,错误返回-1。标题那段代码的意思是,输入Ctrl+z终止循环(这是在Windows下,在Unix环境下是Ctrl+d)。如果你输入字符a,而循环体里又没有getchar之类读字符的函数,就会死循环,因为a会一直留在输入缓冲区中。要想在输入错误的情况下终止把 !=EOF 去掉就行了,即成功输入的个数为0的情况下推出循环。
在百度过程中见到有while(~scanf("%d",&n)!=EOF)这种写法,找不到具体的解释。后来找到“~”的解释是是取反,即0变1,1变0。试了一下这种方式在输入错误的情况下就退出循环,也就是说~0的值为-1。想了一下也就通了:计算机是以补码存放数字的,0二进制的八位补码为0000 0000,“取反”后为1111 1111,对应的就是-1的补码了。这里的取反加了引号,因为真正算术上的取反,数字符号位是不变的,即0000 0000的反码是0111 1111,而补码为0111 1111的数字是1。
作者:心亦
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
|