死循环(endless loop)
2020-01-06 16:02:10来源:博客园 阅读 ()
死循环(endless loop)
死循环
- 死循环就是一个无法结束的循环。(endless loop / infinite loop)
- 出现死循环是因为没有设置好结束条件,循环的结束条件很重要,要充分考虑各种边界情况。
以上一篇随笔中的习题(找到 n 个可以被整除的数)为例,如果缺少累计次数的条件,那么就会让条件表达式永远满足,这样程序就会永远执行。这样就会产生一个死循环。
public class FindDivEndless { public static void main(String[] args) { int n = 5; int dividend = 100; int divisor = 89; int found = 0; while(found<n) { if(dividend%divisor == 0) { System.out.println(dividend + "可以被" + divisor + "整除。商为" + (dividend/divisor)); } dividend++; } } }
一个特殊的例子
- 用 while 找出 5 个能被 20 0000 0000 整除的数
- 程序最终依然会结束
public class FindNDivNotEndless { public static void main(String[] args) { int n = 5; int dividend = 100; int divisor = 2000000000; // 数值会溢出int的取值范围 int found = 0; while (found < n) { if (dividend % divisor == 0) { found++; System.out.println(dividend + "可以被" + divisor + "整除。商为" + (dividend / divisor)); } dividend++; } } }
出现这种情况的原因是,20亿接近 int 的最大取值,再往下累加就会导致数值溢出。
按照二进制的加法,那么加着加着,最高位就会是1,而在计算机中,二进制数值是用补码的形式表示和存储的,
因此最高位符号位是1时,就变成了负数,这就是为什么第二个找到的数是负数的原因。
于是,如果不仅仅找5个可以被整除的数时,就会不断的1、 -1、 0、 1、 -1 这样重复下去。
那么又如何解决数值溢出而产生负数结果的问题呢?
使用 break 语句结束循环
- break语句可以结束任何循环
- 不考虑负数的情况,使用 break 解决问题
public class FindNDivBetter { public static void main(String[] args) { int n = 5; int dividend = 100; int divisor = 2000000000; int found = 0; String start = "从" + dividend + "开始,"; while (found < n) { // 当被除数数值溢出时,跳出整个while循环。 if (dividend < 0) { System.out.println("被除数溢出,计算结束!"); break; } if (dividend % divisor == 0) { found++; System.out.println(dividend + "可以被" + divisor + "整除。商为" + (dividend / divisor)); } dividend++; } System.out.println(start + "共找到" + found + "个可以被" + divisor + "整除的数。"); System.out.println(dividend); // 结果是-2147483648,确实是一个负数。 } }
原文链接:https://www.cnblogs.com/buildnewhomeland/p/12158384.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:代码生成器那点事儿
- 你说研究过Spring里面的源码,循环依赖你会么? 2020-06-09
- switch循环所支持的数据类型 2020-06-07
- Netty源码死磕一(netty线程模型及EventLoop机制) 2020-05-19
- 【JAVA SE基础篇】14.循环嵌套 2020-05-11
- 非常有用的并发控制-循环栅栏CyclicBarrier 2020-05-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash