不行这个问题我一定要记下来!
能让我产生这个想法的,是上个礼拜在手敲KMP的时候,因为我把模式串的首元素标为-1,于是我的代码在KMP循环的时候总会诡异地再跑完整个字符串前跳出,经过不断地检查,我发现代码执行的时候出现了这个诡异的bug:
-1 < 3 = 0
???-1<3结果为假?难道我的电脑有它自己的想法?
当时我的判断是这么写的:
if (j < str.length())
后来身后地大佬建议我写成这样:
int len = str.length();
if (j < len)
然后奇迹般地好了……好了……了……
后来查阅了C++ Reference后,发现 string::length() 返回的是一个无符号整形,于是这个问题也就解开了。
int a = -1;
unsigned int b = 3;
cout<<(a<b)<<endl; # false!
经过推测,大概是编译器会在比较前,将带负数的 int 强制转换为 unsigned int ,后果不言而喻。
此外,继续浏览后发现,size() 和 find() 系的函数返回的都是无符号整形,这点在今后也要格外注意,不然又要挠破头皮了。