//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未试
*/
//请大家不要考虑程序实际解决问题和算法拙劣的问题。
//集中炮火到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未试
*/
每个for循环开始的时候都会进行一个初始化的操作,在循环for(z=0;z<=10;z+=3)中。程序若执行到这一行。则会将z置0。然后判断z<=10。执行完循环体后,再执行z+=3。当该循环运行第二次的时候,则不会再进行初始化。直接判断z<=0,执行循环体,再执行z+=3。如此循环。
for (;z<=100;z+=3 )//////////////////////////////////注意 无z=0//这两个循环都只执行了1圈阿~~
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================会是这样的结果???
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发生了迭加;具体原因,等待高人出现
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
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也太不用心了!
int i=0,j=0;
for(;i<3;i++){
j=0;
for(;j<3;j++)
System.println(i+"\t"+j);
}
}LZ如果还不明白,最简单的办法就是自己用纸和笔一步步的过一遍程序……
y被修改了以后,下次再执行这个循环是修改后的值,是12
for(y=0;y<=10;j+=2)
y被修改了以后,下次再执行这个循环还是0
所以它后面的循环都只被执行一次。
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 = 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);
}
}
在for循环外面打印x,会得到x=10;循环已经走完
本身这三个变量就是在循环体之外定义的,但是z在循环体之内又重新给赋值了,所以才出现了lz的结果
for(; y < 3; y++) {
System.out.println("x=" + x + " y=" + y);//**
}
}
这样做,只有第一个循环才可以进入**所在的行,以后的循环因为y的值已经是最大了(3),所以不会去执行**行。 。。
再多几个循环也是一样的。。
那天因为有学员问,当时没反应过来,就很匆忙的发在这里了.
真是让大家费心了,写得的确匆忙,而且代码还有复制错的.
但是,仍然有这么多人看得这样的仔细,给了很好的回答.多谢大家了.现在回头一看,原来是很简单的问题.
不过,不同版本的确有不同的结果.这个,大家可以试下。Kokonol 结论说得对,虽然并不详细
hzalan说得很清楚,尤其是还费心给我留言
dxlove 、DHC_simon 和mailtzy1 ,解释得对,但是并不是作用域的问题,盖错了帽。
forestking_xx 说得对。
haizhen448 帮我提出了新的问题,我想想,如果有必要,会再发帖。