C ++不能保证在输入失败时保持变量不变吗?对于旧版本的gcc,像这样的程序会将i的-1值保持为失败(例如,如果输入的是字母而不是输入的数字)。使用Ubuntu 10.10(gcc 4.4.5)时,如果输入失败,i将重置为零。
#include <iostream>
int main()
{
int i = -1;
std::cin >> i;
std::cout << "i = " << i << '\n';
return 0;
}
这种行为打破了我的很多代码。我想gcc的人都知道他们在做什么,这很可能是我的错。如果有人知道这个标准,我想知道它对这种情况的看法。
感谢。
答案 0 :(得分:5)
不要依赖变量。依靠流的状态:
if (std::cin >> i) // "if (!std::cin.fail())" would also work
{
// ok
}
else
{
// error
}
至于为什么行为发生了变化,那是因为C ++标准已经发展:
来自C ++ 03:
如果发生错误,val不变; 否则它被设置为 结果价值。
从C ++ 0x(嗯......从我有权访问的最后一个草稿):
要存储的数值可以是 其中之一:
- 零,如果转换函数无法转换整个字段。
- 最正(或负)可表示的值,如果字段为 转换为有符号整数类型 代表一个太大的积极价值 (或否定的)代表 VAL。
- 最正可表示的值,如果要转换为的字段 无符号整数类型表示一个 无法表示的值 VAL。
- 转换后的值,否则。
答案 1 :(得分:3)
对于这种情况,C ++标准已经改变了所需的行为。这些要求可以在[lib.facet.num.get.virtuals](C ++ 03中的22.2.2.1.2,C ++ 0x中的22.4.2.1.2)中找到。
在C ++ 03中,要求是在出现错误时旧值不变
在C ++ 0x中,要求是在转换错误的情况下存储值0
。
答案 2 :(得分:1)
如果您希望失败的流入不影响您的变量,并且您不希望它将流置于失败状态,则流入字符串,将字符串解析为临时字符串,如果所有成功的话,继续。
您可以使用istringstream将字符串解析为临时字符。