代码之家  ›  专栏  ›  技术社区  ›  Maister

为什么整数溢出会导致C++ IOFROW的错误?

  •  5
  • Maister  · 技术社区  · 15 年前

    好的,我觉得C++的IoSokes有些问题,感觉很奇怪,但是它可能是定义行为,考虑到这两种情况都发生在MSVC++和G ++中。

    假设我有这个程序:

    #include <iostream>
    using namespace std;
    
    int main()
    {
       int a;
       cin >> a;
       cout << a << endl;
       cin >> a;
       cout << a << endl;
    
       return 0;
    }
    

    cin.operator>>() 会因为某种原因立即返回,并且 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;
    }
    
    3 回复  |  直到 15 年前
        1
  •  7
  •   Potatoswatter    15 年前

    iostreams设计用于检测错误并进入错误状态。整数溢出的结果与输入非数字字符串的结果相同。

    铸造 cin (或任何溪流)到 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。

    这个 documentation for scanf 我相信溢出应该是个错误。

        2
  •  1
  •   Matt_JD    15 年前

    我认为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; 
    }
    
        3
  •  0
  •   MSalters    15 年前

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

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

    使用前成功