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

Why >> operator shows different results on different compilers?

本文关键字:gt 显示 结果 编译器 运算符 为什么      更新时间:2023-10-16

我的代码在不同的 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做什么,都会通过访问未初始化的对象来表现出未定义的行为。