A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

最近复习while循环,在editplus上想写一个死循环。写着写着,突然就改变了while()中的判断条件。但是在编译阶段突然发现了不同的区别。请看我的截图。

complie.PNG (143.03 KB, 下载次数: 71)

编译结果不同

编译结果不同

评分

参与人数 1技术分 +1 黑马币 +2 收起 理由
何伟超 + 1 + 2

查看全部评分

7 个回复

倒序浏览
因为当你吧判断条件设置为while(a>0)时,编译器是不知道你的判断条件是否会导致System.out.println("永远执行不到我");永远无法执行,因为a在运行时是可变的,一旦a发生变化小于0了就能停下了,所以编译能通过。而当你用while(true)的话,这个循环是停不下的,编译器就能检测出这是个死循环,会导致这个循环外的代码无法运行,所以编译器不允许这样的代码出现。
简单点比喻就是用while(a>0)时,编译器觉得还有希望能跳出死循环,所以通过了。
           而用while(true)的话编译器就一点希望也看不到能跳出死循环,所以编译失败。

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
igi9009 发表于 2014-4-24 14:32
因为当你吧判断条件设置为while(a>0)时,编译器是不知道你的判断条件是否会导致System.out.println("永远执 ...

我按照你的说的,继续使用 int b=3;while(b==3)System.out.println("编译阶段报错");System.out.println("永远执行不到我");这里的while(b==3)不是相当于whlie(true)么?为什么编译阶段没有报错。也许这个牵扯到底层的东西吧。
回复 使用道具 举报
한숨짓다 发表于 2014-4-24 14:45
我按照你的说的,继续使用 int b=3;while(b==3)System.out.println("编译阶段报错");System.out.printl ...

原因是编译器是个懒B,==运算也是需要计算的,编译器才懒得给你算。
回复 使用道具 举报
第二个while循环的循环条件直接给的是一个值,编译器直接就能判断是否是死循环,第一w'hile循环条件给的是一个表达式,编译器可没那个能耐立即看出这个表达式的值,它更不知道这个表示今后在多次循环中值得变化情况如何。所以第二个w'hile循环之后的代码不能执行,编译器当然要告诉你一下啦。
回复 使用道具 举报
eternallove 发表于 2014-4-24 19:51
第二个while循环的循环条件直接给的是一个值,编译器直接就能判断是否是死循环,第一w'hile循环条件给的是 ...

不错,有点意思。
回复 使用道具 举报
eternallove 发表于 2014-4-24 19:51
第二个while循环的循环条件直接给的是一个值,编译器直接就能判断是否是死循环,第一w'hile循环条件给的是 ...

不错,有点意思。
回复 使用道具 举报
代码在执行的时候还不能判断你的while里面是真还是假,所以可以,下面的那个不用判断,所以不行!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马