在无符号数和有符号数比较时,编译器会将有符号数转换为无符号数,一定要注意这一点,否则会非非非非非常坑!!!!
比如说
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int x=-1; 5 unsigned int y=2; 6 if(x>y) 7 cout<<"yes"; 8 else 9 cout<<"no"; 10 return 0; 11 }
x是有符号的-1,y是无符号的2,正常人都知道-1小于2啊,所以运行这段代码后,一定会输出no啊,可是结果却是yes,为什么呢?因为无符号数和有符号数作比较的时候,编译系统会自动将有符号数转换为无符号数,这就是关键了,当有符号数-1和无符号数2比较的时候,系统会把有符号的-1转换为无符号数,-1转换有无符号数就是4294967295,这个数当然比2大,所以就输出yes了。
上面说的这种情况是比较明显得,因为代码中出现了无符号数类型,可是有时候,这种错误及其不容易发现,比如:
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int x=-1; 5 string str="JOHN WALKER"; 6 if(x>str.size()) 7 cout<<"yes"; 8 else 9 cout<<"no"; 10 return 0; 11 }
这段代码中还是定义了一个值为1得有符号变量x,然后又定义了一个字符串,是用string类型定义的,然后判断x是不是大于字符串的长度,这个字符串长度为11,这谁都知道!所以x肯定小于11啊,但是代码的运行结果却是yes,纳尼?-1竟然大于11???
一定是我的打开方式不对,可是尝试好几次之后,结果都一样,于是我就陷入了对人生的大思考之中……
那么最后,我终于发现,这个c++自带的string类的size函数和length函数的返回值竟然是无符号数!那么这就可以说的通了,有符号数和无符号数比较的过程中,有符号数会转换为无符号数,-1转换为无符号数是4294967295,所以它就大于11了,所以就输出yes了。
唉,没想到罪魁祸首竟然是因为size函数和length函数的返回值是无符号数,其实这个也可以理解,当初开发C++的前辈一定是认为字符串的长度一定不能是负数,所以将返回值设成无符号数,这样还能增大表示范围。
所以以后再用size和length函数的时候,还是先用一个有符号变量来接收返回值吧,这样就不会有问题了。
比如:
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int x=-1; 5 string str="JOHN WALKER"; 6 int len=str.size(); 7 if(x>len) 8 cout<<"yes"; 9 else 10 cout<<"no"; 11 return 0; 12 }
这样,输出就一定是NO了。