为什么 >> 运算符在不同的编译器上显示不同的结果?
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
做的任何事情都表现出未定义的行为。
我的代码在不同的 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
做的任何事情都表现出未定义的行为。