//JDK 6 测试
//请大家不要考虑程序实际解决问题和算法拙劣的问题。
//集中炮火到for循环的循环变量赋初值否引起的怪结果。
class Test{
public static void main(String[] args){
int x=0,y=0,z=0;//变量已经有初始值
for(;x<=10;x++)//注意 无初始化x的语句
 for (;y<=10;y+=2 )//注意 无初始化x的语句
  for (z=0;z<=10;z+=3 )//注意 写了z=0    
    System.out.println("x="+x+",y="+y+",z="+z);
}
}
/*
结果输出:
x=0,y=0,z=0
x=0,y=0,z=3
x=0,y=0,z=6
x=0,y=0,z=9
x=0,y=2,z=0
x=0,y=2,z=3
x=0,y=2,z=6
x=0,y=2,z=9
x=0,y=4,z=0
x=0,y=4,z=3
x=0,y=4,z=6
x=0,y=4,z=9
x=0,y=6,z=0
x=0,y=6,z=3
x=0,y=6,z=6
x=0,y=6,z=9
x=0,y=8,z=0
x=0,y=8,z=3
x=0,y=8,z=6
x=0,y=8,z=9
x=0,y=10,z=0
x=0,y=10,z=3
x=0,y=10,z=6
x=0,y=10,z=9
*/
//1.4中,y不变。只有z变(对别人操作的印象,不保证准确)
/*
class Test{
public static void main(String[] args){
int x=0,y=0,z=0;//变量已经有初始值
for(;x<=20;x++)//注意 无初始化x的语句
 for (;y<=33;y++ )//注意 无初始化x的语句
  for (;z<=100;z+=3 )//////////////////////////////////注意 无z=0
   
    System.out.println();
}
}
程序输出:
x=0,y=0,z=0
x=0,y=0,z=3
x=0,y=0,z=6
x=0,y=0,z=9
*/
//1.4无输出/*
class Test{
public static void main(String[] args){
int x=0,y=0,z=0;//变量已经有初始值
for(;x<=10;x++)//注意 无初始化x的语句
 for (y=0;y<=10;y+=2 )//////////注意 写了y=0
  for (z=0;z<=10;z+=3 )//////////注意 写了z=0
   
    System.out.println("x="+x+",y="+y+",z="+z);
}
}
//输出结果完整
1.4未试
*/

解决方案 »

  1.   

    楼主是不是想知道为什么一个没有输出,一个有输出啊。呵呵,如果是这样的化,请检查无输出的那个代码的打印语句System.out.println()。如果是想了解循环执行过程的话,如下:
    每个for循环开始的时候都会进行一个初始化的操作,在循环for(z=0;z<=10;z+=3)中。程序若执行到这一行。则会将z置0。然后判断z<=10。执行完循环体后,再执行z+=3。当该循环运行第二次的时候,则不会再进行初始化。直接判断z<=0,执行循环体,再执行z+=3。如此循环。
      

  2.   

    for (;y<=33;y++ )//注意 无初始化x的语句
    for (;z<=100;z+=3 )//////////////////////////////////注意 无z=0//这两个循环都只执行了1圈阿~~
      

  3.   

    class Test{
    public static void main(String[] args){
    int x=0,y=0,z=0;//变量已经有初始值
    for(;x<=20;x++)//注意 无初始化x的语句
     for (;y<=33;y++ )//注意 无初始化x的语句
      for (;z<=100;z+=3 )//////////////////////////////////注意 无z=0
       
        System.out.println();
    }
    }
    程序输出:
    x=0,y=0,z=0
    x=0,y=0,z=3
    x=0,y=0,z=6
    x=0,y=0,z=9================会是这样的结果???
      

  4.   

    执行到for(;y<=10;y++)该层循环时,它的前面几层循环都将只执行一次:例如:
    for (m = 0; m <= 10; m += 2)
                for (x = 0; x <= 10; x += 2)
                    for (; y <= 10; y += 2)
                        for (z = 0; z <= 10; z += 3)
                            System.out.println("m=" + m + "x=" + x + ",y=" + y + ",z=" + z);
    打印出来:
    m=0x=0,y=0,z=0
    m=0x=0,y=0,z=3
    m=0x=0,y=0,z=6
    m=0x=0,y=0,z=9
    m=0x=0,y=2,z=0
    m=0x=0,y=2,z=3
    m=0x=0,y=2,z=6
    m=0x=0,y=2,z=9
    m=0x=0,y=4,z=0
    m=0x=0,y=4,z=3
    m=0x=0,y=4,z=6
    m=0x=0,y=4,z=9
    m=0x=0,y=6,z=0
    m=0x=0,y=6,z=3
    m=0x=0,y=6,z=6
    m=0x=0,y=6,z=9
    m=0x=0,y=8,z=0
    m=0x=0,y=8,z=3
    m=0x=0,y=8,z=6
    m=0x=0,y=8,z=9
    m=0x=0,y=10,z=0
    m=0x=0,y=10,z=3
    m=0x=0,y=10,z=6
    m=0x=0,y=10,z=9
    而y本身将实现累加;如果是:
                for (; x <= 10; x += 2)
                    for (y = 0; y <= 10; y += 2)
                        for (z = 0; z <= 10; z += 3)
    将全部打印出来而如果是:
                for (; x <= 10; x += 2)
                    for (; y <= 10; y += 2)
                        for (; z <= 10; z += 3)
    只有z发生了迭加;具体原因,等待高人出现
      

  5.   

    public class Test {
        public static void main(String[] args) {
            int add = 0;
            int x = 0, y = 0, z = 0;// 变量已经有初始值
            for (int m = 0; m <= 10; m += 2) {
                add++;
                System.out.println("1#" + "m=" + m + ",x=" + x + ",y=" + y + ",z=" + z + "..@" + add);
                for (x = 0; x <= 10; x += 2) {
                    add++;
                    System.out.println("2#" + "m=" + m + ",x=" + x + ",y=" + y + ",z=" + z + "..@" + add);
                    for (; y <= 10; y += 2) {
                        add++;
                        System.out.println("3#" + "m=" + m + ",x=" + x + ",y=" + y + ",z=" + z + "..@"
                                        + add);
                        for (z = 0; z <= 10; z += 3) {
                            add++;
                            System.out.println("4#" + "m=" + m + ",x=" + x + ",y=" + y + ",z=" + z
                                            + "..@" + add);
                        }
                    }
                }
            }
        }
    }打印结果:
    1#m=0,x=0,y=0,z=0..@1
    2#m=0,x=0,y=0,z=0..@2
    3#m=0,x=0,y=0,z=0..@3
    4#m=0,x=0,y=0,z=0..@4
    4#m=0,x=0,y=0,z=3..@5
    4#m=0,x=0,y=0,z=6..@6
    4#m=0,x=0,y=0,z=9..@7
    3#m=0,x=0,y=2,z=12..@8
    4#m=0,x=0,y=2,z=0..@9
    4#m=0,x=0,y=2,z=3..@10
    4#m=0,x=0,y=2,z=6..@11
    4#m=0,x=0,y=2,z=9..@12
    3#m=0,x=0,y=4,z=12..@13
    4#m=0,x=0,y=4,z=0..@14
    4#m=0,x=0,y=4,z=3..@15
    4#m=0,x=0,y=4,z=6..@16
    4#m=0,x=0,y=4,z=9..@17
    3#m=0,x=0,y=6,z=12..@18
    4#m=0,x=0,y=6,z=0..@19
    4#m=0,x=0,y=6,z=3..@20
    4#m=0,x=0,y=6,z=6..@21
    4#m=0,x=0,y=6,z=9..@22
    3#m=0,x=0,y=8,z=12..@23
    4#m=0,x=0,y=8,z=0..@24
    4#m=0,x=0,y=8,z=3..@25
    4#m=0,x=0,y=8,z=6..@26
    4#m=0,x=0,y=8,z=9..@27
    3#m=0,x=0,y=10,z=12..@28
    4#m=0,x=0,y=10,z=0..@29
    4#m=0,x=0,y=10,z=3..@30
    4#m=0,x=0,y=10,z=6..@31
    4#m=0,x=0,y=10,z=9..@32
    2#m=0,x=2,y=12,z=12..@33
    2#m=0,x=4,y=12,z=12..@34
    2#m=0,x=6,y=12,z=12..@35
    2#m=0,x=8,y=12,z=12..@36
    2#m=0,x=10,y=12,z=12..@37
    1#m=2,x=12,y=12,z=12..@38
    2#m=2,x=0,y=12,z=12..@39
    2#m=2,x=2,y=12,z=12..@40
    2#m=2,x=4,y=12,z=12..@41
    2#m=2,x=6,y=12,z=12..@42
    2#m=2,x=8,y=12,z=12..@43
    2#m=2,x=10,y=12,z=12..@44
    1#m=4,x=12,y=12,z=12..@45
    2#m=4,x=0,y=12,z=12..@46
    2#m=4,x=2,y=12,z=12..@47
    2#m=4,x=4,y=12,z=12..@48
    2#m=4,x=6,y=12,z=12..@49
    2#m=4,x=8,y=12,z=12..@50
    2#m=4,x=10,y=12,z=12..@51
    1#m=6,x=12,y=12,z=12..@52
    2#m=6,x=0,y=12,z=12..@53
    2#m=6,x=2,y=12,z=12..@54
    2#m=6,x=4,y=12,z=12..@55
    2#m=6,x=6,y=12,z=12..@56
    2#m=6,x=8,y=12,z=12..@57
    2#m=6,x=10,y=12,z=12..@58
    1#m=8,x=12,y=12,z=12..@59
    2#m=8,x=0,y=12,z=12..@60
    2#m=8,x=2,y=12,z=12..@61
    2#m=8,x=4,y=12,z=12..@62
    2#m=8,x=6,y=12,z=12..@63
    2#m=8,x=8,y=12,z=12..@64
    2#m=8,x=10,y=12,z=12..@65
    1#m=10,x=12,y=12,z=12..@66
    2#m=10,x=0,y=12,z=12..@67
    2#m=10,x=2,y=12,z=12..@68
    2#m=10,x=4,y=12,z=12..@69
    2#m=10,x=6,y=12,z=12..@70
    2#m=10,x=8,y=12,z=12..@71
    2#m=10,x=10,y=12,z=12..@72
      

  6.   

    A方法如下:
    public void A(){
        for(int i=0;i<3;i++)
           for(int j=0;j<3;j++)
              System.println(i+"\t"+j);
    }B方法如下:
    public void B(){
        int i=0,j=0;
        for(;i<3;i++)
           for(;j<3;j++)
              System.println(i+"\t"+j);
    }俩方法乍看是一样的,其实你只要自己手动去跑一遍程序,就知道是不一样的了。
    这么简单的问题,LZ也太不用心了!
      

  7.   

    A方法相当于在B方法里加了一行,如下:public void B(){
        int i=0,j=0;
        for(;i<3;i++){
           j=0;
           for(;j<3;j++)
              System.println(i+"\t"+j);
        }
    }LZ如果还不明白,最简单的办法就是自己用纸和笔一步步的过一遍程序……
      

  8.   

    for(;y<=10;j+=2)
    y被修改了以后,下次再执行这个循环是修改后的值,是12
    for(y=0;y<=10;j+=2)
    y被修改了以后,下次再执行这个循环还是0
    所以它后面的循环都只被执行一次。
      

  9.   

    System.out.println(); ()里面 没参数  也能打印出程序输出:
    x=0,y=0,z=0
    x=0,y=0,z=3
    x=0,y=0,z=6
    x=0,y=0,z=9
    ????????????????
      

  10.   

    这个一个关于变量的作用域的问题:
    请楼主看清楚:
      当你开始的时候,给初始值的时候
      X = 0
      Y = 0
      Z = 0
      都是为0
      那个Z递历完之后 
      Y=Y+2
      Z又开始变成原来的0
      ……
      一直到第Y结束 
      最后到X的时候
      由于Y没有重新赋值
      Y还是原来的10
      所以后来的代码不要执行
      也就是说里面两个都不执行
      所以就是你想的那个结果
      不懂的话,可以再问?
        建议 以后写成这样
      当class Test{
       public static void main(String[] args){
        //int x=0,y=0,z=0;//变量已经有初始值
          for(int x=0;x<=10;x++)//注意 无初始化x的语句
            for (int y=0;y<=10;y+=2 )//注意 无初始化x的语句
               for (int z=0;z<=10;z+=3 )//注意 写了z=0   
              System.out.println("x="+x+",y="+y+",z="+z);
           }
     }
      
      

  11.   

    同意楼上,作用域问题。
    在for循环外面打印x,会得到x=10;循环已经走完
      

  12.   

    明显的变量作用域问题,dxlove() ( ) 信誉:100  讲的非常清楚了,lz结帖吧。
    本身这三个变量就是在循环体之外定义的,但是z在循环体之内又重新给赋值了,所以才出现了lz的结果
      

  13.   

    for(; x < 3; x++) {
                for(; y < 3; y++) {
                    System.out.println("x=" + x + " y=" + y);//**
                }
            }
    这样做,只有第一个循环才可以进入**所在的行,以后的循环因为y的值已经是最大了(3),所以不会去执行**行。 。。
    再多几个循环也是一样的。。
      

  14.   

    我想楼主想问的是,不同版本的JDK运行结果不一样吧。。不过我没有试过用1.4的 我用的是1.5的
      

  15.   

    哈哈哈,我都忘记自己发了这么个帖子.今天看邮箱提醒才想起来.
    那天因为有学员问,当时没反应过来,就很匆忙的发在这里了.
    真是让大家费心了,写得的确匆忙,而且代码还有复制错的.
    但是,仍然有这么多人看得这样的仔细,给了很好的回答.多谢大家了.现在回头一看,原来是很简单的问题.
    不过,不同版本的确有不同的结果.这个,大家可以试下。Kokonol 结论说得对,虽然并不详细
    hzalan说得很清楚,尤其是还费心给我留言 
    dxlove 、DHC_simon 和mailtzy1 ,解释得对,但是并不是作用域的问题,盖错了帽。
    forestking_xx 说得对。
    haizhen448 帮我提出了新的问题,我想想,如果有必要,会再发帖。