while (~scanf("%d%d",&m,&n))什么用的?


  ACM中比較常見,其功能是循環從輸入流讀取m和n,直到遇到EOF為止,等同於while (scanf("%d%d",&m,&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,如此成了死循環……


免責聲明!

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



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