首頁 > 後端開發 > C++ > 為什麼在 C 11 及更高版本中「stringstream」會在提取失敗時修改目標變數?

為什麼在 C 11 及更高版本中「stringstream」會在提取失敗時修改目標變數?

Barbara Streisand
發布: 2024-11-26 15:46:09
原創
488 人瀏覽過

Why Does `stringstream` Modify the Target Variable on Extraction Failure in C  11 and Later?

為什麼 stringstream >> C 11 之後擷取失敗時會改變目標值?

Stroustrup 的「TC PL」指出,如果 istream 或 ostream 操作失敗,目標變數的值應保持不變。然而,這與使用 stringstream 觀察到的行為相矛盾:

#include <iostream>
#include <sstream>

int main() {
  std::stringstream ss;
  int v = 123;
  ss << "The quick brown fox.";
  if (ss >> v) {
    std::cout << "Unexpected success in reading a word into an int!\n";
  }
  std::cout << "After extraction failure: " << v << "\n";
  return 1;
}
登入後複製

儘管 Stroustrup 聲稱,此程式碼列印「提取失敗後:0」。

C 11 行為修改

這個矛盾源自於 C 11 之後 stringstream 行為的改變。在 C 11 之前, stringstream 使用 scanf 風格的解析方法,失敗時保持目標值不變。然而,從 C 11 開始,它採用了 std::strtoll,它將零寫入值變數並在提取失敗時設定故障位元。

此變更與修訂後的 C 11 istream 和 ostream 操作行為一致:

  • 失敗時,目標值設定為 0 或適當的極值。
  • failbit設定為指示失敗。

結論

雖然Stroustrup 的引用準確地描述了C 11 之前的istream 和ostream 操作的行為,但stringstream 的後C由於採用了不同的提取機制,11 行為偏離了此描述。在 C 11 及更高版本中,使用 stringstream 操作時必須注意這種改變的行為。

以上是為什麼在 C 11 及更高版本中「stringstream」會在提取失敗時修改目標變數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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