首页 >后端开发 >C++ >为什么在 C 11 及更高版本中,'stringstream >>” 在提取失败时会将目标变量清零?

为什么在 C 11 及更高版本中,'stringstream >>” 在提取失败时会将目标变量清零?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-01 06:16:12633浏览

Why Does `stringstream >>` 在 C 11 及更高版本中提取失败时将目标变量清零?
>` 在 C 11 及更高版本中提取失败时将目标变量清零? " />

为什么 stringstream >> 在失败时更改 Target 的值?

在引用 Stroustrup 的“TC PL,第 3 版”的段落中,作者指出该值如果提取操作失败,v 的值应保持不变,但是,一个示例与此语句相矛盾,因为当 stringstream >> v 操作时 v 被清零。

矛盾行为解释

理解这种明显矛盾的关键在于提取运算符>>C 11之前和之后的不同行为。

C 之前11

在 C 11 之前,>>使用 scanf 风格的解析机制。当提取失败时,它会保持 v 的值不变并设置失败位标志。

自 C 11

随着 C 11,>>>切换为使用 std::num_get 方面来解析输入。根据更新的规范,如果提取失败:

  • 对于 int 等基本类型,将 0 写入 v 并设置失败位标志。
  • 对于有溢出保护的类型,如 std::numeric_limits::max() 或 std::numeric_limits::min() 写入 v并且设置了失败位标志。

示例输出说明

在提供的示例中:

  • v 的值为最初是 123。
  • 尝试将单词读入 v 后(失败),该值
  • stringstream的rdstate()表示设置了failbit,确认提取失败。

此行为与>的更新行为一致>在 C 11 中引入。

以上是为什么在 C 11 及更高版本中,'stringstream >>” 在提取失败时会将目标变量清零?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn