编程常见错误——循环中进行有符号数和无符号数的比较
2016-02-25 17:42
295 查看
不要轻视甚至无视,编译器所报的警告,警告不是错误,但比错误更加凶险。也即,我们要追求没有警告的程序。
本文,将以编译器经常会报的一个异常:warning C4018: “>=”: 有符号/无符号不匹配 为例说明忽视警告常会伴随一些古怪的结果发生。
当带正负号的
故当一个有符号数与无符号的0比较(一个无符号数永远大于等于0),并用作循环是否执行的判断依据时,将很有可能陷入死循环,无论循环体的内部是否对该有符号数执行减法的操作。
上述代码陷入死循环中,显然是循环退出的条件
永远无法满足循环退出的条件;
据说Java语言的基本数据类型都是有符号的,所以Java中不存在该问题)
本文,将以编译器经常会报的一个异常:warning C4018: “>=”: 有符号/无符号不匹配 为例说明忽视警告常会伴随一些古怪的结果发生。
当带正负号的
i与不带正负号的类型比较时,
i会自动转型为无正负号值。
故当一个有符号数与无符号的0比较(一个无符号数永远大于等于0),并用作循环是否执行的判断依据时,将很有可能陷入死循环,无论循环体的内部是否对该有符号数执行减法的操作。
for (size_t i = 5; i >= 0; --i) std::cout << i << " "; std::cout << std::endl;
上述代码陷入死循环中,显然是循环退出的条件
i >= 0永远无法满足,这又是为什么呢,
i不是一直在减吗?不要忘记,
i的类型为
size_t,也即
unsigned int,无符号整数,而无符号的0减去1得到的结果一定不是-1,
std::cout << size_t(0)-1 << std::endl; // 4294967295
永远无法满足循环退出的条件;
据说Java语言的基本数据类型都是有符号的,所以Java中不存在该问题)
相关文章推荐
- 数以千计使用百度代码的应用收集并泄露用户个人数据
- 数以千计使用百度代码的应用收集并泄露用户个人数据
- AIX平台上使用JAVA程序连接到DB2数据库
- VS2010和matlab2010混合编程中char16_t重定义的问题
- C,C++宏中#与##的学习记录
- 使用cpplint检测代码规范
- Spring-04-事务管理
- 初学Java的类加载与反射机制(一)
- php四种基础算法:冒泡,选择,插入和快速排序法
- java学习笔记-多态
- C# 获取或设置本地打印机及配置文件操作
- github入门实践(本地端与远程端)
- python实现批量图片的抓取
- LeetCode_5_LongestPalindromicSubstring(最长回文子序列)
- 黄聪:深入理解PHP Opcode缓存原理
- idapython让生活变得更美好:第五部分
- idapython让生活变得更美好:第四部分
- idapython让生活变得更美好:第二部分
- idapython让生活变得更美好:第三部分(条件断点)
- java实现给图片添加水印、透明度