今天用while循环写题的时候发现对于循环条件里面新奇的地方同小伙伴们一起分享
一般情况下的循环条件
while(1)
{
//永真循环
}
while(i<1000)
{
//正常循环进行条件
}
while(n--)
{
//正常循环进行条件
}
.....等等,只要是while()循环里面的表达式为真就可以进行循环
Different conditions
while((scanf("%d",&a)!=EOF))
{
//循环体
}
while(~(scanf("%d",&a)))
{
//循环体
}
while(scanf("%d",&n) == 1)
{
//循环体
}
EOF
- EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。
- 在C语言中,EOF表示文件结束符(end of file)。在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件。在文本文件中,数据都是以字符的ASCII代码值的形式存放。我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用EOF作为文件结束标志。
- 实际上 EOF 的值通常为 -1,但它依系统有所不同。
- C语言中,EOF常被作为文件结束的标志。还有很多文件处理函数处错误后的返回值也是EOF,因此常被用来判断调用一个函数是否成功。
当上面的程序运行时,如果不加" != EOF",那么这个程序就是个死循环,会一直运行下去;加上" != EOF"后该程序就不是死循环了,如果在终端不进行输入该程序会自动结束(while的意思就是说当当前输入缓存还有东西时就一直读取,直到输入缓存中的内容为空时停止)。
另:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.
按位取反运算符(~)
二进制数在内存中以补码的形式存储!!!
按位取反:二进制每一位取反,0变1,1变0。
~9的计算步骤:
正数的反码和补码与原码相同。
负数的反码除符号位之外全部取反,补码为反码+1。
转二进制:01001
计算补码:01001
由于二进制数在内存中按照补码存储,所以现在就可以进行 ~ 的操作:10110
转为补码:
取反:11001
加1:11010
即~9的结果为-10
总结
实际上 EOF 的值通常为 -1,但它依系统有所不同。
取反运算符公式:n=-(n+1)
时刻牢记计算机中二进制以补码的形式存在。
scanf(“%d%d”, &a, &b);
如果a和b都被成功读入,那么scanf的返回值就是2;如果只有a被成功读入,返回值为1;如果a和b都未被成功读入,返回值为0;如果遇到错误或遇到end of file,返回值为EOF,且返回值为int型。