int userMonth;
cin >> userMonth; // 輸入 0.99
while (userMonth > 12 || userMonth < 1) {
cin >> userMonth; // 死循環
}
cin >> userMonth 讀取整數,從輸入流中解析出 0(0.99 的整數部分),賦值給 userMonth。.99,下一次 cin >> userMonth 嘗試讀取整數,遇到 . 非數字字符,讀取失敗,userMonth 值不變(仍為 0),流進入錯誤狀態(failbit)。cin 操作均無效,循環條件永真,陷入死循環。在循環內打印 cin.good()、cin.fail()、userMonth 即可觀察到流狀態變化。
double 或 string,再轉換檢查。cin.clear() 清除錯誤標誌,並 cin.ignore(numeric_limits::max(), '\n') 跳過殘留輸入。while (!(cin >> userMonth) || userMonth < 1 || userMonth > 12) 結合輸入操作本身判斷。核心教訓:cin 讀取失敗不會拋出異常,只會設置錯誤標誌並停止提取,必須顯式檢查並恢復。