黑马程序员技术交流社区

标题: 从一个死循环看Java编译后的结果区别 [打印本页]

作者: 한숨짓다    时间: 2014-4-24 13:59
标题: 从一个死循环看Java编译后的结果区别
最近复习while循环,在editplus上想写一个死循环。写着写着,突然就改变了while()中的判断条件。但是在编译阶段突然发现了不同的区别。请看我的截图。

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

编译结果不同

编译结果不同

作者: igi9009    时间: 2014-4-24 14:32
因为当你吧判断条件设置为while(a>0)时,编译器是不知道你的判断条件是否会导致System.out.println("永远执行不到我");永远无法执行,因为a在运行时是可变的,一旦a发生变化小于0了就能停下了,所以编译能通过。而当你用while(true)的话,这个循环是停不下的,编译器就能检测出这是个死循环,会导致这个循环外的代码无法运行,所以编译器不允许这样的代码出现。
简单点比喻就是用while(a>0)时,编译器觉得还有希望能跳出死循环,所以通过了。
           而用while(true)的话编译器就一点希望也看不到能跳出死循环,所以编译失败。
作者: 한숨짓다    时间: 2014-4-24 14:45
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)么?为什么编译阶段没有报错。也许这个牵扯到底层的东西吧。
作者: kuroro自走核炮    时间: 2014-4-24 14:47
한숨짓다 发表于 2014-4-24 14:45
我按照你的说的,继续使用 int b=3;while(b==3)System.out.println("编译阶段报错");System.out.printl ...

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

不错,有点意思。
作者: 한숨짓다    时间: 2014-4-25 21:54
eternallove 发表于 2014-4-24 19:51
第二个while循环的循环条件直接给的是一个值,编译器直接就能判断是否是死循环,第一w'hile循环条件给的是 ...

不错,有点意思。
作者: 你为谁归来    时间: 2014-4-25 22:18
代码在执行的时候还不能判断你的while里面是真还是假,所以可以,下面的那个不用判断,所以不行!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2