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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 小佛爷 中级黑马   /  2013-6-28 19:50  /  3238 人查看  /  18 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘凯 于 2013-7-1 07:58 编辑

在看到视频中讲while()后面不能加分号举例的时候,有这段代码:

  1. <P>  int x=1;</P>
  2. <P>  while(x<3);     //请注意,这里有分号的
  3.   {
  4.    System.out.println("x="+x);
  5.    x++;
  6.   }</P>
复制代码
运行结果是:一直在判断x<3。(在命令行中运行结果表现的形式是光标一直闪)

无意中把x<3改写成x<1
即:
  1. int x=1;
  2. while(x<1);      //这里改成x<1
  3. {
  4. System.out.println("x="+x);
  5. x++;
  6. }
复制代码
运行结果却是:
x=1
这是怎么回事呢?
上面那段代码视频中讲的是一直在判断while中的条件表达式,一直满足条件一直在判断;
那下面这段代码x的初始化值不满足x<1,是直接执行大括号中的内容么?这里的大括号跟while有什么关系?
求赐教~~~多谢!

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

18 个回复

倒序浏览
第一个:while(x<3); 因为x=1,满足条件,会一直循环下去。 ------》在命令行中运行结果表现的形式是光标一直闪。

第二个:while(x<1);因为x=1,不满足条件,直接跳出循环。-------》运行结果是初始化的值1。

OK了吧! {:soso_e130:}
另外说个:无限循环的两种最简单表达形式:
               for(;;){}       //条件表达式默认为true。
               while(ture){}

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
不满足条件,继续执行下面代码啊!你加上分号之后,下面的代码就不属于while循环的执行代码了。
回复 使用道具 举报
  1. int x=1;
  2. while(x<1){};      //因为你的x被赋值为1,这里判断为false,所以直接跳出while循环,执行下面的打印语句

  3. System.out.println("x="+x);
  4. x++;
复制代码
你肯定是以为那个大括号是while语句里面的,其实他们是两个独立的代码语句
  1. System.out.println("x="+x);
  2. x++;
  3. 这两个代码并不在while语句当中
复制代码

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
大括号里面的是当while判断成功时执行的
回复 使用道具 举报
  1. int x=1;

  2. while(x<1);      //这里改成x<1后,完整一点就是while(x<1){},当这里判断语句为X<3时,它是一直满足条件的,所以就循环执行while(X<3){},
  3.               //当while(x<1){}因为不满足条件,所以就不运行{}

  4. {                                            //这里从这个括号开始,到下一个括号结束,这是一段构造代码块,构造代码块是针对所有对象初始化值的,优先于构造方法执行。
  5. System.out.println("x="+x);

  6. x++;

  7. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报

while语句和构造代码块就是两码事了
回复 使用道具 举报
不加分符,括号里的代码和while是一个整体,加上分符就不一样了,第一个语句是无限循环的while。
{
     while(x<3);      //死循环
     
    //下边的代码是一个构造代码块



    {
         System.out.println("x="+x);
        x++;
   }
}

评分

参与人数 1技术分 +1 收起 理由
刘凯 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. //楼主纠结的地方:while的条件表达式(x<1)不符合 定义表达式 x=1 为什么还会打印X=1
复制代码
{:soso__3669389859068460655_3:}个人理解不全面的地方,大家指正下,共同进步哈

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
。。。编辑半天,显示出错了。。
回复 使用道具 举报
  1. <div class="blockcode"><blockquote>int x=1;
  2. while(x<1);      //条件表达式(X<1),不符合X初始值1,所以放弃循环,因为;的原因,语句结束  
  3. {
  4. System.out.println("x="+x);//本来是循环体。因为上面的一个;这段代码就是一个独立的代码块了.无法与跟上面的条件表达式构成while循环语句
  5. x++;                                   //x的自增原本是配合上面while条件的,既然while表达式都报废了.它也不属于循环体了
  6. }
复制代码
综上所述:这个程序的有效代码就是
  1. int x=1;

  2. {
  3. System.out.println("x="+x);

  4. }
复制代码
结果就是X=1
个人理解,欢迎指正,共同进步嘛{:soso__3669389859068460655_3:}
【先前发布没成功,看看这次代码能发全部】


回复 使用道具 举报
碰到类似问题了。。。
回复 使用道具 举报
int x=1;
while(x<1);                                    //加分号,代表它是一条完整的while语句;


{                                                     //构造代码块,优先于构造函数的对所有对象进行初始化的;
System.out.println("x="+x);
x++;
}



因为while后面是分号,所以说while(x<3);和while(x<1);都是一个完整的while循环语句了,
与下面的构造代码块 并不构成一个整体;
{     
System.out.println("x="+x);
x++;
}


所以当初始化x=1;,
while(x<3);构成了死循环,
由于初始化x=1,一直都是x<3,所以根本无法执行到下面的构造代码快,也就不能执行到x++语句;
而是一直在while语句上循环,所以结果会一直闪下去;


而当x=1,while(x<1);的时候,
x=1,就已经不满足的循环条件了,
所以直接跳出循环语句;
执行下面的构造代码块,
结果输出 x=1;

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
第一个程序中X=1,小于3是符合条件了,在执行while,但是后面加上;就代表while循环的介绍,所以没有下文了。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
  1. package Demo;

  2. public class Test {
  3.                 public static void main(String[] args){
  4.                         int x =1;
  5.                         while(x <3){
  6.                                
  7.                         };
  8.                         {
  9.                                 System.out.println("x="+x);
  10.                                 x++;
  11.                         }
  12.                 }
  13. }
复制代码
第一个代码完整起来就是这样的,因为x=1;所以一直满足while的判断;而且x的值没有变,所以会造成一直进行判断,而无法执行下面构造代码块的语句。
  1. package Demo;

  2. public class Test {
  3.                 public static void main(String[] args){
  4.                         int x =1;
  5.                         while(x <1){
  6.                                
  7.                         };
  8.                         {
  9.                                 System.out.println("x="+x);
  10.                                 x++;
  11.                         }
  12.                 }
  13. }
复制代码
第二个完整下来是这样的,因为x=1;未满足循环条件,所以直接跳出了循环,执行构造代码块中的语句,输出x=1;

另外,楼主你肯定把构造代码块跟while循环当成了一个整体,当你while(x<3);后面加了“;”之后,他就是一个完整的while循环语句了,相当于:
  1. while(x <3){
  2.                                
  3.                         };
复制代码
他们是两个整体,一个是while循环的,一个是构造代码块的。
回复 使用道具 举报
第一个程序中x=1,小于3符合循环条,程序无限循环所以光标一直在闪.
在while语句后面加分号说明后面的{}就是一个局部代码块,如果是该{}在类中定义就是一个构造代码块。随着类的加载而加载。
回复 使用道具 举报
while后面分号说明语句结束了,下面的不满足while的条件就去执行大括号里面的内容了,大括号这是个代码块,就输出x=1

点评

”下面的不满足while的条件就去执行大括号里面的内容了“?代码块最先执行吧  发表于 2014-3-13 07:54
回复 使用道具 举报
jagon 中级黑马 2014-3-12 12:15:28
18#
int x=1;
while(x<1);      //这里改成x<1
{
System.out.println("x="+x);
x++;
}
注解:while(x<1);  这时一个循环结构,但是循环体确是一个空语句,因为x=1,所以x<1为假,不再执行循环体,所以直接执行System.out.println("x="+x);   输出的结果就是x=1;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马