避免将unsigned int和int放在布尔表达式中作比较
2013-11-25 11:45
246 查看
这个标题不够犀利,不少人看到第一反应肯定是——“这我知道啊”。但是很多人肯定写过如下的代码:
这个例子是将所有的小写字母变成大写字母,很正常。但是这种编程习惯有个隐藏的风险,再来看下面这段代码,这段代码的作用是,遍历容器v,然后每次将长度不大于range的字符串打印出来。range会逐渐减小。你觉得输出的结果是什么?
正常而言,我们期望它的输出如下:
但实际输出是:
是不是有人觉得自己不会写出这样的代码,即便在其它地方也不会出现非这样写不可的情况。但事实是,你写了都不知道……我今天做leetcode的“text justification”用了很久才发现布尔表达式里面计算出了非常奇怪的结果,浪费了很多时间。
上面代码的问题在于用一个无符号unsigned值与一个有符号的int作比较,当range变为-1的时候,在表达式v[i].size() <= range中,它会被转换成一个无符号的数,因此会变成一个很大的正数,程序的输出就和原来期望不复合了。
当然也不是说永远不能让无符号和有符号的数比较,但是你在这么写的时候,一定要知道自己在做什么,并且知道这样做是没有问题的。如果用Visual Studio,我印象中其对于这种比较是会出警告的,但是很多编译器就不会警告。问题是即便我用Visual Studio,也会自动忽略那段编译警告,Xcode就压根没有警告……
C++用得比较多,但是我越用越觉得自己好像就没怎么掌握这门语言
#include<iostream> #include<string> #include<cstring> using namespace std; int main() { string s = "abcde"; for(int i = 0; i < s.size(); ++i) { s[i] = toupper(s[i]); } cout<<s<<endl; }
这个例子是将所有的小写字母变成大写字母,很正常。但是这种编程习惯有个隐藏的风险,再来看下面这段代码,这段代码的作用是,遍历容器v,然后每次将长度不大于range的字符串打印出来。range会逐渐减小。你觉得输出的结果是什么?
#include<cstring> #include<iostream> #include<string> #include<vector> using namespace std; int main() { vector<string> v; v.push_back("abc"); v.push_back("ab"); v.push_back("a"); v.push_back("ab"); v.push_back("abc"); int range = 3; for(int i = 0; i < v.size(); ++i, --range) { if(v[i].size() <= range) { cout<<v[i]<<endl; } } }
正常而言,我们期望它的输出如下:
abc ab a
但实际输出是:
abc ab a
abc
是不是有人觉得自己不会写出这样的代码,即便在其它地方也不会出现非这样写不可的情况。但事实是,你写了都不知道……我今天做leetcode的“text justification”用了很久才发现布尔表达式里面计算出了非常奇怪的结果,浪费了很多时间。
上面代码的问题在于用一个无符号unsigned值与一个有符号的int作比较,当range变为-1的时候,在表达式v[i].size() <= range中,它会被转换成一个无符号的数,因此会变成一个很大的正数,程序的输出就和原来期望不复合了。
当然也不是说永远不能让无符号和有符号的数比较,但是你在这么写的时候,一定要知道自己在做什么,并且知道这样做是没有问题的。如果用Visual Studio,我印象中其对于这种比较是会出警告的,但是很多编译器就不会警告。问题是即便我用Visual Studio,也会自动忽略那段编译警告,Xcode就压根没有警告……
C++用得比较多,但是我越用越觉得自己好像就没怎么掌握这门语言
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/cry.gif)
相关文章推荐
- -2比2小吗? C++ 中 unsigned int 和 int的比较
- -2比2小吗? C++ 中 unsigned int 和 int的比较
- -2比2小吗? C++ 中 unsigned int 和 int的比较
- int 与 unsigned int (uint) 比较时出现的问题
- int与unsigned int之间的运算与比较
- Integer与int的比较
- int与NSNumber之间的相互转化,以及转化问题对数值比较的影响
- int、integer比较。。。。
- Integer与int的种种比较你知道多少?
- Integer与int的比较
- Java中int和Integer比较问题
- 表达式之谜2找零时刻(需要精确答案的地方,避免使用float和double;货币运算使用int,long或BigDecimal)
- java中Long类型数据必须转化为int才能正确比较
- WSAAsyncSelect 模型 - 还是接着以前的socket、 部分继续研究, 近期将精力 放在各种模型上面,比较缺点,实现出来
- Integer与int的种种比较
- sql:字段累加(int ,varchar)避免Null+"文本"=Null
- Integer和int的种种比较
- int 与 unsigned int 移位运算
- int Integer 区别比较