在 C 流中,失敗處理的行為因流類型和語言版本而異。這種差異的例子是使用 stringstream 將單字讀入整數變數時觀察到的意外行為。
傳統上,如 Stroustrup 的 TC PL(第 3 版)中所述,如果輸入操作失敗,目標變數應保留某些資料類型不變。然而,當在 stringstream 中遇到類型不符時,變數的值會被修改,與引用的引用相矛盾。
造成這種差異的原因在於 C 11 中實現的變更。在 C 11 之前,stringstream 採用 scanf 風格的解析來擷取數字。在 C 11 中,此方法被替換為 std::strtoll 等呼叫函數,這些函數會在失敗時修改目標。
因此,解析策略的變更引入了不同的失敗行為。在 C 11 之前,目標保持不變,而在 C 11 及更高版本中,失敗時目標設定為零。
要驗證此理論,請參閱參考文獻,例如答案中提供的那個。此參考文獻解釋了在 C 11 之前,提取失敗會導致值未修改並設定故障位元。但是,在 C 11 及更高版本中,失敗會導致目標值為零並設定失敗位元。
此外,參考文獻指出輸入運算子依賴 num_get locale 方面,該方面利用 do_get 函數。在 C 11 中,do_get 已被修改為使用 std::strtoll 和類似函數,從而導致觀察到的行為變化。
以上是為什麼 C Stringstream 的故障處理在 C 11 前後有所不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!