Chinaunix首页 | 论坛 | 博客
  • 博客访问: 96151
  • 博文数量: 17
  • 博客积分: 366
  • 博客等级: 一等列兵
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-16 16:31
文章分类

全部博文(17)

文章存档

2011年(17)

我的朋友

分类: C/C++

2011-06-16 17:21:54

今天同事拿下面一段代码给我看,并给我描述了一个不可思议的现象:将函数返回一个值之后再做判断与直接判断结果截然不同。
在不使用临时变量赋值的情况下,本来应该运行到A的代码直接跳转到B了
                                                ///int r = translateToLower(str).find("text");
  if( translateToLower(str).find("text") <0 )   /// if( r <0 ) 
  {                                             ///{
      ...... /// A                                       ...... //// A 运行到此   
   }                                            ///}

  ...... /// B  直接运行到此                    ///        ...... /// B   

我们一起调试之后确认其描述不虚。这似乎颠覆了我们对函数返回值、临时变量的理解,真是不可思议。
困惑之下,我还是隐隐觉得这种怪现象应该与模板库find函数的使用有关。
最终阅读了文档之后我们恍然大悟。我觉得有趣将其记录于此。
文档里有这样的定义:
find函数在找不到指定值得情况下会返回string::npos。
string::npos
static member constant
static const size_t npos = -1;
Maximum value for size_t

问题就在这:
将一个负数付给无符号数,这是一个非常聪明的技巧,正如文档所言,它是无符号数size_t的最大值。

可是当同事将这个返回值付给int 型变量r的时候,它却因为超出了int的上限被转换成了负数-1,所以我们调试后想当然得认为函数返回值<0成立。
殊不知在不经过转换的情况下,函数的返回值作为一个无符号数却是远远大于0的。由此产生了让我们一撇之下感到不可思议的事情。
这不正是书本里三番五次强调的无符号数陷阱么?没想到居然在这种情况下遭遇到了。
正确的做法应该是:
if( translateToLower(str).find("text") != string::npos )
阅读(4069) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:遭遇Meyers单件的多线程问题

给主人留下些什么吧!~~