C++ 为什么>&燃气轮机;运算符在不同的编译器上显示不同的结果?

C++ 为什么>&燃气轮机;运算符在不同的编译器上显示不同的结果?,c++,istream,C++,Istream,我的代码在不同的IDE上显示不同的结果。对于我的IDE上的输入1//2,它会显示输入格式错误,但在另一个IDE上,它会抛出DivisionByZero 我已经尝试将包含在.peek()=='/'中,即使这样做没有意义,但没有效果 struct DivisionByZero : public exception { const char * what() const throw() { return "Zero Denominator"; } }; R的构造函数

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

我已经尝试将
包含在.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;
}
std::istream&operator>>(std::istream&in,R&R){
int n,d;
在>>n;
if(in.peek()=='/'))
{
in.ignore();
如果((in.peek()<'0'| | in.peek()>'9')){
in.setstate(ios_base::failbit);
}
在>>d;
r=r(n,d);
}
返回;
}
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;
rn1,n2;
char op;
尝试
{
而(cin>>n1>>op>>n2){
开关(op){
格“+”:

d
中的cout
失败,因为流中的字符不能被解析为整数。
d
保持未初始化状态。无论是什么
R(n,d)<代码> > <代码> d>代码>显示未定义的行为,通过访问未初始化对象.< /p>在提取失败时,<代码> istrAM/<代码> s,从C++ 11开始,该变量不再被修改。如果编译C++版本比C++ 11大,则只是未定义的行为。@席弗兰假设流从一开始就设置了
failbit
,并且OP的代码在尝试提取之前显式设置了
failbit
。为什么没有设置
failbit
?本质上是,
in.setstate(ios_base::failbit)
应该执行。@FrançoisAndrieux在标准的实际文本中,将
val
设置为零是由
操作符>
本身完成的。但是,如果已经设置了
failbit
,则会注意到并且不会达到
num\u get
调用。@RishbhSharma您确实设置了
failbit
,然后继续执行并执行一个命令无论如何,尝试从现在失败的流中读取,而且,使用该读取的结果(保证失败)在
R
计算中。我认为显示
//一些代码在这里很重要。您询问是否应该引发异常,但您已经显示了除相关部分之外的所有内容。即,可能引发异常的部分。添加了更多代码。自.peek()中的
以来
必须返回
“/”
in.setstate(ios_base::failbit)
应该可以工作,但它只在我的IDE上工作。您在什么平台和编译器上获得不需要的输出?如何提供输入(手动键入或管道输入)?可能需要消除输入未正确接收的可能性,可能是shell或其他东西正在重新解释
/
。代码在大学测试环境中进行测试。输入通过stdin提供。代码必须通过各种测试用例,
1//2-1/3
是导致此未定义beh的输入阿维奥。