其功能是循環從輸入流讀入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緩沖區讀到相同的內容,這樣就形成了死循環……