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,如此成了死循環……