我正在处理以下代码。
#include <iostream>
int main()
{
std::cout << "Enter numbers separated by whitespace (use -1 to quit): ";
int i = 0;
while (i != -1) {
std::cin >> i;
std::cout << "You entered " << i << '\n';
}
}
我知道使用while (std::cin >> i)
本来会更好,但我不明白具体的情况。
如果我提供无效输入,则循环变为无限,因为输入流进入故障位状态。我的问题是输入变量i
会发生什么?就我而言,无论先前输入的值如何,它都变为0。输入无效后为什么会变为0?这是预定义的行为吗?
答案 0 :(得分:7)
因为你有一个pre-C ++ 11编译器,所以你得零。在失败时保持输入值不变是最新标准中的新功能。旧标准要求如下:
如果提取失败,则零写入值并设置failbit。如果 提取导致值太大或太小而无法适应 value,std :: numeric_limits :: max()或std :: numeric_limits :: min() 写入并设置failbit标志。
(source)
对于gcc,您需要将-std=c++11
传递给编译器以使用新行为。