首頁 > 後端開發 > C++ > 為什麼 C Stringstream 的故障處理在 C 11 前後有所不同?

為什麼 C Stringstream 的故障處理在 C 11 前後有所不同?

Mary-Kate Olsen
發布: 2024-11-25 02:23:29
原創
196 人瀏覽過

Why Does C   Stringstream's Failure Handling Differ Before and After C  11?

失敗處理對字串流目標值的影響

在 C 流中,失敗處理的行為因流類型和語言版本而異。這種差異的例子是使用 stringstream 將單字讀入整數變數時觀察到的意外行為。

傳統上,如 Stroustrup 的 TC PL(第 3 版)中所述,如果輸入操作失敗,目標變數應保留某些資料類型不變。然而,當在 stringstream 中遇到類型不符時,變數的值會被修改,與引用的引用相矛盾。

C 11 修改

造成這種差異的原因在於 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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板