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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李海鹏 中级黑马   /  2013-1-18 17:50  /  4238 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李海鹏 于 2013-1-20 08:32 编辑

public class Demo
{
public static void main(String []args)
{
  int i = 0, j = 5;
  tp: for (;;)
  {
   i++;
   for(;;)
   {
    if(i > j--)
     break tp;
   }
  }
  System.out.println("i = " + i + ", j = "+ j);
}
}  
问:这个问题好像问过了,我不明白的是这个程序怎么运行过程,for(;;)是什么意思?为什么i++只运行一次?

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

8 个回复

倒序浏览
本帖最后由 黑马唐贤来 于 2013-1-18 18:06 编辑

首先,这个这个嵌套循环使用了标记从内循环直接退出,而标记就是 tp:,
for(;;)就是死循环和while(true)一样!

至于为什么i++只运行了一次,因为内循环满足了if(i > j--)条件,内循环控制的语句 break tp;是直接退出了嵌套循环
下面摘自"张孝祥正在整理Java就业面试题大全.doc",推荐你多看看,里面有很多经典问答
  1. 在JAVA中如何跳出当前的多重嵌套循环?
  2. 在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如,
  3. ok:
  4.         for(int i=0;i<10;i++)
  5.         {
  6.                 for(int j=0;j<10;j++)
  7.                 {
  8.                         System.out.println(“i=” + i + “,j=” + j);
  9.                         if(j == 5) break ok;
  10.                 }
  11.         }
  12. 另外,我个人通常并不使用标号这种方式,而是让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。
  13. int arr[][] = {{1,2,3},{4,5,6,7},{9}};
  14. boolean found = false;
  15. for(int i=0;i<arr.length && !found;i++)
  16.         {
  17.                 for(int j=0;j<arr[i].length;j++)
  18.                 {
  19.                         System.out.println(“i=” + i + “,j=” + j);
  20.                         if(arr[i][j]  == 5)
  21.                         {
  22.                                 found = true;
  23.                                 break;
  24.                         }
  25.                 }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
分析一下程序运行,首先创建两个int型变量,之后进入for(;;)循环,这个循环相当于while(true)是死循环。
然后执行i++。i值这时候是1,然后进入内层的for(;;)死循环,然后if判断,如果不满足条件接着走里边的for循环,
这句话的意思是直到i>j了,才break tp;也就是跳出tp标号的for循环(这里指外层for循环),当j=0时满足跳出条件,
但是满足之后j要进行--操作,所以打印结果是i=1,j=-1

评分

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

查看全部评分

回复 使用道具 举报
      for(;;)是for循环的固定格式,具体为:for(开始执行循环就执行,且仅执行一次的语句;判断语句,返回值为真则执行循环体中的内容;循环体执行后,执行一次的语句)
    由于程序中有tp:是一个标志,当break tp时,代表tp的循环直接跳出(而不是只跳出嵌套循环的内层循环)。上面代码中,i初始值为0,j初始值为1,所以i>j--时判断成立,因此跳出了tp开始的循环,所以i++只运行了一次。
回复 使用道具 举报
代码整理了一下.
  1. public class Demo
  2. {
  3.         public static void main(String []args)
  4.         {
  5.                 int i = 0, j = 5;   
  6.                 tp: for (;;)       
  7.                 {
  8.                         i++;               
  9.                                                
  10.                         for(;;)
  11.                         {
  12.                                 if(i > j--)   
  13.                                 break tp;
  14.                         }
  15.                 }
  16.                 System.out.println("i = " + i + ", j = "+ j);
  17.         }
  18. }
复制代码
1. for (;;): 没有条件表达式,为无限循环体.
2. tp:为标记. 结合后面面的 break tp; 就是用来跳出被标记的循环.
3. for嵌套循环,因为i++放在内循环前执行,所以i的值自加一次.
4. 如果 i++放在for()语句内部,则是i = 0;因为是在一次循环完毕后执行的,内循环直接跳出则为0
5. j-- : 因为无限循环,所以j一直在做自减的动作.

最后,i 自加一次. i = 0; j因为有if(i > j--)作为条件,所以最后可以跳出全部循环. j = -1;

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 张洪慊 于 2013-1-18 19:22 编辑

for里面如果不写判断条件,则为true
①首先判断外层循环 条件为真,进入外层循环:i++-->1
②进入内层循环判断 条件为真,进入i>j--(j--,先使用j,然后j=j-1),1>5-->false,j=j-1(j为4)-->接着内层循环条件依然为真-->1>4-->false,j=j-1(3)
   直至-->1>0 true,j=j-1-->j=-1,执行  break tp; 跳出外循环-->打印i=1,j=-1
补充一下:
i--这个表达式的值为 i
int i=1;
System.out.println(i--);//1
回复 使用道具 举报
谢毅 中级黑马 2013-1-18 20:03:23
7#
你的这个程序相当于
int i=0,j=5;
while(true){
       i++;
       while(true){
           j--;
           if(i>j)
               return;
       }
}
回复 使用道具 举报
       tp:  break tp;   再JAVA中已经放弃对  goto 的使用,保留了 标签。 但是不会有人使用它的,太不安全了!   所以本人,不建议使用。
下面讲  代码: for (;;)  是一个 无限死循环 , 当 运行到if(i > j--) 条件成立吗? 显然不成立!所以,  又死循环了!
int i = 0, j = 5;
  tp: for (;;)
  {
   i++;
   for(;;)
   {
    if(i > j--)
     break tp;
   }
  }
  System.out.println("i = " + i + ", j = "+ j);
}
}  
回复 使用道具 举报
这个我也明白了,第一:你要懂程序怎么走的流程,第二:你看变量i,j是不是定义在for外面,所以答案就明显了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马