8
#include<iostream>;

int main()
{
    int a = 1;
    int b = 2;
    std::cin >> a >> b;
    std::cout << a << "+" << b << "=" << a+b << std::endl;
    return 0;
}

当我3 4作为输入输入时,输出将是3+4=7,嗯,这很奇怪;但是当我输入时a b,输出是0+0=0(为什么是0和0?);最令人困惑的是a 4,它将是0+0=0(为什么不是'0 + 4 = 4'??????);然后我写另一个编。

#include<iostream>;

int main()
{
    int a = 1;
    int b = 2;
    std::cin >> a;
    std::cin.clear();
    std::cin >> b;
    std::cout << a << "+" << b << "=" << a+b << std::endl;
    return 0;
}

当我进入a 4时,为什么它仍然0+0=0?不应该0+4=4吗?

感谢所有的热心人!!

我写prog3,来测试我不写的时候会发生什么int a=1;int b=2

2

#include <iostream>
using namespace std;
int main()
{  
    int a,b;
    cin >> a  ;
    cin >> b;
    cout<< a << "+"<< b <<"="<< a+b << endl;
    return 0;
}

再一次a b,它输出0+-1218170892=-1218170892(为什么不是0+0=0??)

4

3 回答 3

1

根据 C++11,在出现错误时将值设置为零:如果提取失败,则将零写入值并设置故障位。

在“a 4”示例中,两个值都是 0,因为缓冲区尚未被刷新/清除,因此第二次 cin 读取仍在读取错误,并且还接收到 0 值。

于 2012-09-13T15:08:17.447 回答
1

像所有的一样istreamsstd::cin有错误位。发生错误时设置这些位。例如,您可以使用 、 、 等函数查找错误位的值good()bad()如果eof()您读取错误输入(fail()返回true),请使用clear()清除标志。您可能还需要ignore(1);删除违规字符。

有关详细信息,请参阅该State functions部分。http://en.cppreference.com/w/cpp/io/basic_ios

于 2012-09-13T14:42:34.417 回答
0

std::cin 是一个 istream 实例,因此它在读取无效内容时保持其错误状态。

为了“治愈”它,你必须清除它的标志

std::cin.clear();

并刷新其缓冲区。

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

更令人惊讶的是,当您输入无效字符时,它不会返回 1 + 2 = 3,因为我希望失败的 cin 流对其尝试更新的内容没有副作用。

于 2012-09-13T14:42:50.420 回答