为什么>>运算符在不同的编译器上显示不同的结果?

时间:2019-06-13 15:30:33

标签: c++ istream

我的代码在不同的IDE上显示不同的结果。对于我的IDE上的输入1//2,它会显示输入格式错误,但是在其他IDE上,它会抛出DivisionByZero

我尝试添加in.peek() == '/' ,即使这样做没有道理,但无济于事。

struct DivisionByZero : public exception {
    const char * what() const throw() {
        return "Zero Denominator";
    }
};

R

的构造函数
R::R(int n, int d)
{
    if (d==0)
    {
        throw DivisionByZero();
    }
    n_ = n * (d / abs(d));
    d_ = abs(d);
}

操作员>>

std::istream &operator>>(std::istream &in, R &r){
    int n, d;
    in >> n;

    if (in.peek() == '/')
    {
        in.ignore();
        if ( (in.peek() < '0' || in.peek() > '9') ){
            in.setstate(ios_base::failbit);
        }
        in >> d;
        r = R(n, d);
    }
    return in;
}

main()代码

R n1, n2;
char op;
try
{
while (cin >> n1 >> op >> n2) {
    switch (op) {
        case '+':
            cout << n1 + n2 << endl;
            break;
        case '-':
            cout << n1 - n2 << endl;
            break;
        case '*':
            cout << n1 * n2 << endl;
            break;
        case '/':
            cout << n1 / n2 << endl;
            break;
        }
    }
}
catch(DivisionByZero& e){
    cerr << e.what();
    return 1;
}
if (cin.fail())
{
    cin.clear();
    cerr << "Input format error before '" << char(cin.peek()) <<"'";
    return 2;
}
return 0;

预期输出Input format error before '/'

实际输出Zero Denominator

1 个答案:

答案 0 :(得分:6)

in >> d失败,因为流中的字符无法解析为整数。 d尚未初始化。 R(n, d)然后对d进行的任何操作都通过访问未初始化的对象而表现出未定义的行为。