黑马程序员技术交流社区

标题: 循环后加了分号 [打印本页]

作者: 正阳门下    时间: 2015-12-17 23:03
标题: 循环后加了分号
for(; ;);{
       System.out.println("hello");
}
这个编译的时候是会报错;
但是
int i=2;
while (i>1);{
   System.out.println("World");
}
这个是编译通过的,求解释
作者: xbin0316@qq.com    时间: 2015-12-17 23:08
for循环的括号,编译器是靠;号来区别里面几个部分的,你把;打在了括号外面,编译器会把那个)当做最后一个;号里的内容,语法结构就不完整了。
以上全凭个人经验猜测。
作者: wangmiaosen    时间: 2015-12-17 23:14
是挺难以理解,同问
作者: 正阳门下    时间: 2015-12-17 23:22
xbin0316@qq.com 发表于 2015-12-17 23:08
for循环的括号,编译器是靠;号来区别里面几个部分的,你把;打在了括号外面,编译器会把那个)当做最后一 ...

有几分道理的
作者: xbin0316@qq.com    时间: 2015-12-17 23:22
我更正前面说的话;还记得for循环不用{}的简写形式么?你的代码里面就是for的简写,简写的语句快就是;,也就是说这个for循环语句块里面什么都没有。
作者: xbin0316@qq.com    时间: 2015-12-17 23:23
然后你后面跟着{}就是没意义的东西,所以报错。
作者: 手有键盘心不慌    时间: 2015-12-17 23:27
你这个分分号很费解啊
作者: 李永佳    时间: 2015-12-18 12:17
语法错误也拿来分享.........................
作者: 魏志林    时间: 2015-12-18 12:41
我觉得while是一条语句,system.out也是一个代码块,相当于两个独立的部分,所以可以通过
作者: 18338762337    时间: 2015-12-18 15:24
我觉得你的while程序可以编译通过但是不会执行出结果吧
作者: 正阳门下    时间: 2015-12-18 22:25
18338762337 发表于 2015-12-18 15:24
我觉得你的while程序可以编译通过但是不会执行出结果吧

对的,仅仅是通过,没有结果
作者: 正阳门下    时间: 2015-12-18 22:39
xbin0316@qq.com 发表于 2015-12-17 23:22
我更正前面说的话;还记得for循环不用{}的简写形式么?你的代码里面就是for的简写,简写的语句快就是;, ...

没懂,可以讲得仔细点吗
作者: chengz    时间: 2015-12-18 22:45
for(;;){}  格式要记牢啊
作者: 正阳门下    时间: 2015-12-18 22:47
李永佳 发表于 2015-12-18 12:17
语法错误也拿来分享.........................

这样大家以后也不会错了
作者: 李勋@1211    时间: 2015-12-18 23:13
我稍微改了下, 把for循环改成这个:
for(int i = 2;i > 1 ;);{
       System.out.println("hello");
                }
编译能通过。
然后把 while循环改成这个:
while (true);{
                   System.out.println("World");
                }       
编译不通过。
我猜测当有变量参与循环时,编译器会觉得有可能在变量满足一定的条件时,就会跳出循环,或者说编译器觉得循环有结束的可能性,当循环中什么也没有,或者while(true);时,这个循环就一定是一个无限循环,没有结束的可能性,下面的代码执行不到,所以会报错。

新手猜测,若有不对的地方,请见谅!

作者: 朱志强    时间: 2015-12-18 23:30
挺费时间的,,
作者: a54267490    时间: 2015-12-18 23:35
李勋@1211 发表于 2015-12-18 23:13
我稍微改了下, 把for循环改成这个:
for(int i = 2;i > 1 ;);{
       System.out.println("hello");

我也感觉是这个原因,谢谢你提出来,这个我还没试过呢
作者: river1205    时间: 2015-12-19 07:25
和概念冲突,你可以看看报什么错啊
作者: Mr.zhao    时间: 2015-12-19 09:24
觉得15楼说得有道理。可能编译的时候就能查出问题
作者: 迷茫不堪的年纪    时间: 2015-12-19 19:16
while编译通过, 但是不执行之后的东西 ,是没有意义的!!!! 一个编译错误,一个运行无意义
作者: 平凡D世界    时间: 2015-12-19 19:23
很简单啊!
作者: 晓晓恩    时间: 2015-12-19 23:20
李勋@1211 发表于 2015-12-18 23:13
我稍微改了下, 把for循环改成这个:
for(int i = 2;i > 1 ;);{
       System.out.println("hello");

我的理解,for循环的3个表达式的语句中,可以省略第一个,第三个,第二个条件判断表达式不能省略,否则编译器是认为对呢?还是错呢?(编译器是很笨的,所以就给你报错了),while(ture); 这就是一个死循环;编译器知道这是死循环;给不了你答案,就给你报错了;
作者: sorryjsy    时间: 2015-12-20 11:02
  1. for(; ;);{
  2.        System.out.println("hello");
  3. }
复制代码
如上代码
编译时,编译器能判断出 for(;;); 是一个完整的for循环,但是也是一个死循环,此时后面的代码快{System.out.println("hello");}就永远不会执行到,此时报错是报 unreachable错误。
  1. int i=2;
  2. while (i>1);{
  3.    System.out.println("World");
  4. }
复制代码
如上代码
编译时,局部变量还没有被赋值(代码编译后运行时才赋值为2),所以,编译器是无法判断while (i>1);是否是死循环,编译器编译的时候认为后面的代码块{System.out.println("World");}有可能会被执行到,所以编译不报错;
运行时,由于i已被赋值为2,while (i>1);是一个死循环,所以后面的代码块不会被执行到,jvm会卡死无响应,除非手动停止进程。

作者: 焚寂    时间: 2015-12-20 11:07
路过,水一下

作者: 王冀仁    时间: 2015-12-20 11:08
[quote]正阳门下 发表于 2015-12-17 23:03
for(; ;);{
       System.out.println(

看了他们的回复我也明白了
作者: Endless_paradox    时间: 2015-12-20 18:23
由一个分号引发的讨论。受教了,虽然不会这样做。
作者: 一个人走天下    时间: 2015-12-21 10:34
考虑那个干什么啊
只要知道  ;   是最后的意思就行了
别乱加
作者: 正阳门下    时间: 2015-12-24 22:30
sorryjsy 发表于 2015-12-20 11:02
如上代码
编译时,编译器能判断出 for(;;); 是一个完整的for循环,但是也是一个死循环,此时后面的代码快{S ...

受教了,多谢哈
作者: 正阳门下    时间: 2015-12-24 22:32
sorryjsy 发表于 2015-12-20 11:02
如上代码
编译时,编译器能判断出 for(;;); 是一个完整的for循环,但是也是一个死循环,此时后面的代码快{S ...

受教了,多谢哈
作者: 鳌少宝    时间: 2015-12-24 22:46
左大括号是不用加分号的,你这样写就直接结束了




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