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

Why >> operator shows different results on different compilers?

我的代码在不同的 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

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