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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 廖智 中级黑马   /  2012-7-12 21:36  /  2338 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 廖智 于 2012-7-12 22:50 编辑

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);
}
}
为运行什么结果为:1,-1   
帮忙解释下程序的运行流程?

11 个回复

正序浏览
这个--放在前面和后面,优先级别是不同的。平时我们在使用for循环遍历时,都没有注意到。但在其他情况下,就会产生问题。
回复 使用道具 举报
public class Demo
{
public static void main(String []args)
{
  int i = 0, j = 5;
  tp: for (;;)             //首先for(::)表示可以无限循环,知道遇到break语句跳出循环

   {                        //当程序进入外部的for循环后,首先执行i++,此时i = 1;
   i++;
   for(;;)                        //然后程序在内部for循环中执行,每次执行对if语句进行一次判断,并且对j进行自减操作, 注意,是先判断在自减
    {
     if(i > j--)                  //当j的值为0时,i>j满足条件,此时j先自减,然后执行 break tp: ,而tp表识的是外部的for循环,所以外部循环液结束。
      break tp;
   }
   }
System.out.println("i = " + i + ", j = "+ j);
}
}
回复 使用道具 举报
蒋映辉 发表于 2012-7-12 21:41

public class Demo
{
public static void main(String []args)
{
  int i = 0, j = 5;
  tp: for (;;)
  {
   i++; //外层循环只执行了一次 所以i=1
   for(;;)
   {
    if(i > j--)//i永远为1  j一次减小  注意--这个问题了 当j=0的时候满足条件  但是j仍然要-- 所以最后得到了-1 ***这块重要的是看j--这块。j是先和i比较然后再减一。这点知道了题就简单了。
     break tp;
   }
  }
System.out.println("i = " + i + ", j = "+ j);
}
}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
陈冲 中级黑马 2012-7-12 22:05:24
9#
本帖最后由 陈冲 于 2012-7-12 22:08 编辑
  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.            该语句执行完毕以后,开始内层循环,只有当内层循环结束以后,外层循环才继续执行;内层循环直到i >j--时,才会结束,这时(i=1)>(j=0),又j参与玩i>j--的运算后,j--,故j=-1;之后break tp语句执行,跳出整个循环,外循环不再执行,故最终结果是i=1,j=-1
  11.            */
  12.            =0
  13.            for(;;)
  14.            {
  15.                 if(i > j--)
  16.                  break tp;
  17.            }
  18.       }
  19.     System.out.println("i = " + i + ", j = "+ j);
  20.     }
  21. }
复制代码
i++语句(注释处)执行完毕以后,开始内层循环,只有当内层循环结束以后,外层循环才继续执行;内层循环直到i >j--时,才会结束,这时(i=1)>(j=0),又j参与完i>j的运算后,j--,故j=-1;之后break tp语句执行,跳出整个循环,外循环不再执行,故最终结果是i=1,j=-1

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
廖智 中级黑马 2012-7-12 22:05:16
8#
李志群 发表于 2012-7-12 21:57
程序思想:是for循环嵌套的,
第一步:首先i=0 进入外for循环 循环第一句判断for(  i=0;条件判断(判断为 ...

懂了,哥们讲得很详细。呜呜~~这题我纠结了一晚上,终于明白了!!谢谢哈!
回复 使用道具 举报
public class Demo
{
public static void main(String []args)
{
  int i = 0, j = 5;
  tp: for (;;)
  {
   i++;
   for(;;)
   {
     j--;
    if(i > j)
     break tp;
   }
  }
System.out.println("i = " + i + ", j = "+ j);
}
}

这主要是运算符和先后运算的问题。
我把程序简单修改一下 ,你对比一下就明白了
修改后的程序运行结果是: i=1,j=0
回复 使用道具 举报
public class Demo
{
public static void main(String []args)
{
  int i = 0, j = 5;
  tp: for (;;)
   {
   i++;
2.执行它的时候,因为楼主也没写循环条件,但根据你的运行结果,可以推测,tp:循环之后i从0经过i++变为1,
   for(;;)
    {
    if(i > j--)
      break tp;
1.运行此处时,因为i=0,j=5.只有在i=0>j--时才能跳出该循环,所以此时j=-1,开始执行tp:
   }
   }
System.out.println("i = " + i + ", j = "+ j); 3.所以此处打印出i和j的值分别为i=1,j=-1
}
}

评分

参与人数 1技术分 +1 收起 理由
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
蒋映辉 发表于 2012-7-12 21:41

刚才在别人的帖子也看到了同样的题目啊····
回复 使用道具 举报
蒋映辉 发表于 2012-7-12 21:41

蒋老师您好看下我分析的对不对嘿嘿
回复 使用道具 举报
程序思想:是for循环嵌套的,
第一步:首先i=0 进入外for循环 循环第一句判断for(  i=0;条件判断(判断为真)  ; ) 继续执行 i++  执行内循环。
for(j= 5;条件判断(判断为真);)继续执行 判断if(i>j--) i=1 j=5 为false break 跳到外循环,

第二步: 继续执行外for循环i被初始话0  继续执行 循环第一句判断for(  i=0;条件判断(判断为真)  ; ) 继续执行 i++  执行内循环。
for(j= 4;条件判断(判断为真);)继续执行 判断if(i>j--) i=1(因为外循环i++l所以为1) j=4(上一圈 j-- 所以为4)  这次判断的是1>4吗为false break 跳到外循环,继续执行外循环

第三步继续执行外for循环i被初始话0  继续执行 循环第一句判断for(  i=0;条件判断(判断为真)  ; ) 继续执行 i++  执行内循环。
for(j= 3;条件判断(判断为真);)继续执行 判断if(i>j--) i=1(因为外循环i++l所以为1) j=3(上一圈 j-- 所以为3)  这次判断的是1>3吗为false break 跳到外循环,继续执行外循环

第四步:继续执行外for循环i被初始话0  继续执行 循环第一句判断for(  i=0;条件判断(判断为真)  ; ) 继续执行 i++  执行内循环。
for(j= 2;条件判断(判断为真);)继续执行 判断if(i>j--) i=1(因为外循环i++l所以为1) j=2(上一圈 j-- 所以为2)  这次判断的是1>2吗为false break 跳到外循环,继续执行外循环

第五步继续执行外for循环i被初始话0  继续执行 循环第一句判断for(  i=0;条件判断(判断为真)  ; ) 继续执行 i++  执行内循环。
for(j= 1;条件判断(判断为真);)继续执行 判断if(i>j--) i=1(因为外循环i++l所以为1) j=1(上一圈 j-- 所以为1)  这次判断的是1>1吗为false break 跳到外循环,继续执行外循环
关键在于第六部:
第六部:继续执行外for循环i被初始话0  继续执行 循环第一句判断for(  i=0;条件判断(判断为真)  ; ) 继续执行 i++  执行内循环。
for(j= 0;条件判断(判断为真);)继续执行 判断if(i>j--) i=1(因为外循环i++l所以为1) j=0(上一圈 j-- 所以为0)  这次判断的是1>0  y-- 为 -1吗为true break 跳出循环体,

输出结果是x=1 y=-1

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); 输出结果 x=1 y=-1
         }
}                 输出结果是1和-1

评分

参与人数 3技术分 +2 黑马币 +1 收起 理由
廖智 + 1
黑马张扬 + 1
蒋映辉 + 1

查看全部评分

回复 使用道具 举报
public class Demo
{
public static void main(String []args)
{
  int i = 0, j = 5;
  tp: for (;;)
  {
   i++; //外层循环只执行了一次 所以i=1
   for(;;)
   {
    if(i > j--)//i永远为1  j一次减小  注意--这个问题了 当j=0的时候满足条件  但是j仍然要-- 所以最后得到了-1
     break tp;
   }
  }
System.out.println("i = " + i + ", j = "+ j);
}
}
为运行什么结果为:1,-1   
帮忙解释下程序的运行流程?

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马