關於while (~scanf("%d %d", &m, &n))的用法



其功能是循環從輸入流讀入m和n,直到遇到EOF,有如下關系:

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

scanf()函數返回成功賦值的數據項數,如果出錯就會返回0,如果檢測到文件結尾則會返回EOF(一般被定義為-1)。利用是scanf()函數的返回值可以來檢測和處理不匹配的輸入。

~是按位取反,-1的十六進制補碼表示為0xffffffff,f是二進制的1111,取反后全部變為0,於是while結束,並且只有返回值為EOF(即-1)時,其取反值才為0,while循環才能結束。

這種寫法的漏洞在於:一旦輸入的值為字符等不能成功賦值的量,scanf()賦值不成功,會把讀到的內容又返回到stdin緩沖區,且取反值使得while又進入到下一次循環,scanf()又從stdin緩沖區讀到相同的內容,這樣就形成了死循環……


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM