1. 程式人生 > >關於while (~scanf("%d %d", &m, &n))的用法

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

次循環 () 表示 補碼 利用 賦值 十六 不成功 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緩沖區讀到相同的內容,這樣就形成了死循環……

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