今天同事拿下面一段代码给我看,并给我描述了一个不可思议的现象:将函数返回一个值之后再做判断与直接判断结果截然不同。
在不使用临时变量赋值的情况下,本来应该运行到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) |