首页 >后端开发 >C++ >为什么 C Stringstream 的故障处理在 C 11 之前和之后有所不同?

为什么 C Stringstream 的故障处理在 C 11 之前和之后有所不同?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-25 02:23:29168浏览

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中文网其他相关文章!

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