for (int x=0;x<3; x++)
{
System.out.println("这是循环体");
}
这是一种很常见的写法,但是使用for循环,我们都形成了一种固化的思维,其实for循环也可以很不一样。
for循环的格式是这样的:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;(循环体)
}
如果我们这样写一个for循环:
for(System.out.println("1");System.out.println("2");System.out.println("3"))
{
System.out.println("4");
}
编译没有通过,并且编译器提示我们,第二个表达式应该是一个Boolean类型。以上我们提到for循环的格式,第二个应该是一个条件表达式,正如编译器提示我们的那样,应该是一个真值或者假值,如果为真,则循环执行,如果为假,那么就跳出循环,所以如上代码肯定是不行 的。
所以我们可以这样写:
for(System.out.println("1");true;System.out.println("3"))
{
System.out.println("4");
}
这样写编译能够通过,但是恒真的条件会让代码陷入死循环。(我们不可以写恒假的表达式,如果写一个恒假的表达式编译会报错)
我们可以看到是3和4进行了循环结果的输入,并没有循环输出1,为了能够清楚看到for循环的执行顺序,我们把代码稍微改一下:
int x=0;
for(System.out.println("1");x<3;System.out.println("3"))
{
System.out.println("4");
x++;
}
输出结果是 1 4 3 4 3 4 3,我们看到1只输出了一次,第一个条件是初始化表达式,它只执行一次;它执行完之后,判断第二个条件是否为真,如果为真,执行循环体,循环体完毕,执行第三个表达式。我们画个图表示执行顺序是这样的:
所以其实我们只需要有一个控制循环的条件表达式(第二个表达式)就可以了,初始化表达式和循环之后的操作表达式其实是可以不用写的,初始化可以写在循环外面,操作表达式可以写在循环体里面
int x=0;
for(;x<3;)
{
System.out.println("4");
x++;
}
但是如果我们的x变量如果只作为循环增量控制,那最好不要这么写,还是要把定义写在初始化表达式里,这样如果for循环结束,x这个变量空间也就释放了,不再占用内存空间,如果把变量定义在循环外,那么它会在循环结束还一直占用内存,不利于系统 的优化。
我们知道有这种写法:
for(;;){
执行语句;(循环体)
}
循环的条件表达式默认为true,所以这是最简单的无限循环的写法。
在实际应用中,我们可能会遇到这种情况:
for循环初始化多个变量,循环结束后的语句有多个
for (int a=0,b=10;a<=5&&b>=5;a++,b-- ) {
System.out.println("a="+a+",b="+b);
}
for循环和while循环可以互换,但两者格式上的不同也决定了两者有所差别,比如之前提到的变量的作用域。当变量值作为循环增量存在时,区别就体现出来了,如果只作为 循环增量,用for比较好,变量被释放,不占用内存空间。