繁体   English   中英

为什么整数溢出会导致C ++ iostream出错?

[英]Why does integer overflow cause errors with C++ iostreams?

好吧,所以我对C ++ iostream有一些问题感觉非常奇怪,但它可能是定义的行为,考虑到MSVC ++和G ++都会发生这种情况。

说我有这个程序:

#include <iostream>
using namespace std;

int main()
{
   int a;
   cin >> a;
   cout << a << endl;
   cin >> a;
   cout << a << endl;

   return 0;
}

如果我故意通过给第一个cin一个大于int的最大限制的值来溢出,那么对cin.operator>>()所有进一步调用将由于某种原因立即返回,并且a被设置为某个值。 该值似乎未定义。

为什么以及这种行为记录在哪里? 有没有办法弄清楚是否发生了这样的溢出?

此外,这个类似的程序似乎按照我的意图工作。 如果我溢出值,它会给a一定的价值,并继续仿佛溢出从来没有发生过。

#include <cstdio>
using namespace std;

int main()
{
   int a;
   scanf("%d", &a);
   printf("%d\n", a);
   scanf("%d", &a);
   printf("%d\n", a);
   scanf("%d", &a);
   printf("%d\n", a);

   return 0;
}

iostream用于检测错误并进入错误状态。 从整数溢出中获得与输入非数字字符串相同的结果。

cin (或任何流) cin.rdstate()bool或检查cin.rdstate()以确定是否发生了错误。

调用cin.clear()cin.ignore()来清除错误。 它将在失败的角色处拾取。

至于官方文件,标准不幸在iostreams的内容中有点难以理解。 见§27.6.1.2.1,27.6.1.2.2和22.2.2.1.1 / 11(不开玩笑):

- 阶段2中累积的字符序列会导致scanf报告输入失败。 ios_base :: failbit被分配给err。

scanf文档同样难以理解,我会相信溢出应该是一个错误。

我认为由于读取无效,cin将自己设置为错误状态。

这里的第一个答复解释了

http://www.dreamincode.net/forums/topic/93200-cin-checking-and-resetting-error-state/

刚试过这段代码,似乎确实设置为失败状态

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a; 
    cin >> a; 
    if(!cin)
    {
        cin.clear();
    }
    cout << a << endl; 
    cin >> a; 
    if(!cin)
    {
        cin.clear();
    }
    cout << a << endl; 

    return 0; 
}

a以未定义的值开头。 这不是cin的错。 尝试:

if (cin >> a) {
  cout << a endl;
}

它会检查读取是否成a使用前成功a

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM