
在閱讀《C Primer Plus》時,許多初學者會好奇:為什麼在 while 迴圈中輸入字母 q,程式就會結束?這其實與 scanf() 的回傳值機制有關。
程式碼中常見 while (status == 1),這裡的 status 是 scanf() 的回傳值。在 C 語言中,任何非零值都視為真,因此只要 status == 1 成立,迴圈就會持續執行。
根據《C Primer Plus 第六版》第 94 頁說明,scanf() 配合 %ld 格式時,會嘗試讀取一個長整數。它會跳過空白字元,尋找數字或正負號(+、-)。一旦遇到非數字字元(如 q),scanf() 會立即停止讀取,並將已讀取的字元轉換為數值存入變數。
當使用者輸入 q 時,scanf() 發現第一個字元既非數字也非符號,因此無法匹配 %ld 格式,導致讀取失敗,回傳值為 0。書中第 95 頁詳細解釋:scanf() 成功轉換並賦值的項目數即為回傳值;若輸入不符合格式,回傳 0;若遇到 EOF 則回傳 EOF。
因此,status 變為 0,條件 status == 1 不再成立,while 迴圈隨之終止,程式結束執行。