我们首先看一段程序:
#include <iostream> #include <string> using namespace std; int main( void ) { string s1( "123456789" ); size_t x = s1.find_first_of( '0', 0 ); if (x == string::npos) { cout << "not find" << endl; } else { cout << s1.at( x ) << endl; } //------------------------------------ x = s1.find_first_of( '5', 0 ); if (x == string::npos) { cout << "not find" << endl; } else { cout << s1.at( x ) << endl; } system( "PAUSE" ); return EXIT_SUCCESS; }
可以看出:返回值与string::npos比较,相等则没找到
那么我们开始关注npos:
npos 是一个常数,用来表示不存在的位置,取值由实现决定,一般是-1。
int idx = str.find("abc"); if (idx == string::npos)上述代码中,idx的类型被定义为int,这是错误的,即使定义为 unsigned int 也是错的,它必须定义为 string::size_type。
在网上也有关于这方面的经验:
将函数返回一个值之后再做判断与直接判断结果截然不同。
在不使用临时变量赋值的情况下,本来应该运行到A的代码直接跳转到B了
///int r = translateToLower(str).find("text"); if( translateToLower(str).find("text") <0 ) /// if( r <0 ) { ///{ ...... /// A ...... //// A 运行到此 } ///} ...... /// B 直接运行到此 /// ...... /// B我们一起调试之后确认其描述不虚。这似乎颠覆了我们对函数返回值、临时变量的理解,真是不可思议。