`
ldbin
  • 浏览: 5792 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

while(true){ i++;}请问如何不会陷入死循环

 
阅读更多
一日晚,突发奇想,想到一道可能在面试中出现的题目(目前还没见过,自己想到的):

while(true){ i++;}请问如何不会陷入死循环,要求不能在大括号之间添加任何语句……

先不要看我后面的内容,你能想到几个答案?


当时把这个题目放到了自己qq签名上,并且借用腾讯的漂流瓶发了12个瓶子,后来签名上有两个同学回应了下,漂流瓶的回应全部没有参考价值,这也说明了有时候咨询问题对象选择的重要性。



自己能想到的答案:

1、使用外部嵌套,使该循环永远执行不了(这点大学一个宿舍同学也想到了);

if(1==2){while(true){ i++;}}



2、直接不用管它,因为i既然能够加加了,那么i一定是整型的变量了,整型的变量都有一个范围的,超过他的范围就会溢出异常了,这宿舍另一个同学也在qq上跟我说过一次;

不过经过我的简单测试,感觉这么让他执行到超出范围的话,不知道要等到什么时候呢,这个答案不怎么算正确的;



3、修改while条件,使循环不能执行:

while(true && false){ i++;}



4、第三个的解决办法中,由此我倒是想到了一个办法,让这个循环体不但不会死循环而且还会执行一定的循环次数:

例如:while(true && i < 5){ i++;}



5、继续,还可以把while条件中的true直接修改为false,这样更直接而且有效;



6、继续,或者干脆将while也修改一下,直接将while修改为if也是一个很好的解决办法,而且也很有效;



7、继续,其实这个题目并没有标明这个循环是在那种编译环境下执行的,起码就我所知的环境,就是这种写法在c++、java、c#、javascript下都是可以执行的,所以我们直接就可以把i定义为一个var i = true 然后跟着这个题目中的语句块while(true){ i++;};

而我们知道,js是解释执行的,所以不存在编译报错的问题,而这样写的话,就会使该js是执行时报错,直接不会出现死循环;



8、其他的所有修改过后直接编译就不通过的在此不作罗列……



while(true){ i++;}请问如何不会陷入死循环,要求不能在大括号之间添加任何语句……

你还能想到几个答案?
1
6
分享到:
评论
8 楼 ldbin 2011-10-12  
更正一下,第二种答案,直接不管,最后肯定会因为溢出而抛出溢出退出循环的说法是错误的.
无意中看到的一个论坛帖子后发现的http://www.iteye.com/topic/1116235

java中对四则运算除了分母为零的情况下会抛出异常外,其他均不会抛出溢出.

经过测试后发现溢出后会将计算结果计算为负数,然后结果正负交互一段,最终一直的结果是i=0,无限循环.

具体原因请看链接帖子.
7 楼 ldbin 2011-10-08  
jelly_x 写道
楼主吃饱了

呵呵,确实是吃饱了之后无聊一下咯……
6 楼 ldbin 2011-10-08  
BuN_Ny 写道
太业余了!直接加个/*  */ 搞定。

呵呵,你确实挺高手,不过这个方法与我的第一种方法没有本质的区别,不过你的方法更巧,very good
5 楼 妍然一笑2010 2011-10-08  
BuN_Ny 写道
太业余了!直接加个/*  */ 搞定。

您真是人才!
4 楼 仅此而已 2011-10-08  
诶 中国缺少你这样的淫才啊。。。。
3 楼 仅此而已 2011-10-08  
BuN_Ny 写道
太业余了!直接加个/*  */ 搞定。

哥说的对!!!
2 楼 jelly_x 2011-10-08  
楼主吃饱了
1 楼 BuN_Ny 2011-10-08  
太业余了!直接加个/*  */ 搞定。

相关推荐

Global site tag (gtag.js) - Google Analytics