C++ 为什么>&燃气轮机;运算符在不同的编译器上显示不同的结果?
我的代码在不同的IDE上显示不同的结果。对于我的IDE上的输入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的构造函数
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的输入阿维奥。