美文网首页
while (~scanf("%d",&n))

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

作者: 瓜尔佳Anthony | 来源:发表于2019-03-06 15:03 被阅读0次

    ACM中比较常见,其功能是循环从输入流读取m和n,直到遇到EOF为止,等同于

    while (scanf("%d", &n) != EOF)
    

    scanf()函数返回成功赋值的数据项数,出错时则返回,EOF定义为-1。~是按位取反,-1十六进制补码表示为0x ffffffff,f是二进制的1111,取反后就全部变成0了,于是while结束。只有返回值为EOF(即-1)时,其取反的的值(即while循环的判断条件)才为0,才能结束循环,其它输入情况下(无论是否输入成功)while循环的判断条件为非0,即为真。

    这种写法的漏洞在于:一但输入的值为字母、符号之类的,scanf赋值不成功把读到的内容又返回到stdin的缓冲区(假设这个值为t),其取反得到的值使while又进入到下一次循环,scanf又从stdin缓冲区里读到了原先吐回的t,如此成了死循环……

    相关文章

      网友评论

          本文标题:while (~scanf("%d",&n))

          本文链接:https://www.haomeiwen.com/subject/mmotpqtx.html