zoukankan      html  css  js  c++  java
  • 提防iostream使用中的一个“陷阱”

     

    先看下面的示例代码:
    template < typename T > void test()
    {
     T o;
     for(T i = numeric_limits< T >::min(); i < numeric_limits< T >::max(); ++i)
     {
      stringstream stream;
      stream << i;
      stream >> o;
      assert(i == o);
     }
    }

    试着按下面这样调用它:
    test< int >();
    一点问题都没有。

    再这样调用:
    test< char >();
    你会发现当i=9的时候,assert在大声地“抱怨”,这种情况下,我们受了stream“放进去什么,拿出来也是什么”的假相的迷惑,往stream放进去一个(char)9,是拿不出来任何东西的!

    或许你说,“好的,我知道了,stream对字符的处理和数值的处理不一样”,我们再来看一个例子:
    test< BYTE >();
    这种情况下,我们一样的被BYTE迷惑了,BYTE是我们一厢情愿定义的“数值”类型,实际上,只是一个unsigned char而已,会被iostream当作char一样处理。

    注:上面的例子只在VC 7.1下、用MS版的STL测试过,别的版本的STL会如何处理char和BYTE,我自己没有测试过,不敢下结论。

    另外,我注意到boost::lexical_cast(V 1.31.0)也没有对char和BYTE做特殊处理。

  • 相关阅读:
    css选择器(常规选择器,伪类选择器,伪元素选择器,根元素选择器)
    css文件引人的三种方式
    《软件测试》阅读笔记
    测试风险管理
    软件缺陷分析
    软件文档
    软件缺陷分析方法
    软件缺陷分析方法:ODC
    [转载]web测试方法总结
    测试报告笔记
  • 原文地址:https://www.cnblogs.com/huqingyu/p/52551.html
Copyright © 2011-2022 走看看