语法形式
for循环的形式为
for (初始化表达式; 条件表达式; 执行调整表达式)
{
循环体;
}
前面我们已经说过while循环,已经很好了,为什么还要有for循环呢?我们先来看这样一段代码:
#include<stdio.h>
int main()
{
int i = 1; //1.初始化
while (i <= 10) //2.条件判断
{
printf("%d ", i);
i++; //3.调整
}
return 0;
}
仍然是打印1~10的数字,我们发现while循环的初始化、条件判断以及调整三部分是分开的。如果代码比较繁琐时,可想而知,这三部分必定相距甚远,使得后续修改要分别找到三个地方将它修改,不够方便,所以,for循环更胜一筹,我们可以来看一下:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
printf("%d ", i);
return 0;
}
我们对比了while循环和for循环,在程序中,for循环的使用频率也是最高的。
其次,break和continue在for循环中与while中意义一样,但是又有一点差异,我们看for循环中的continue:
#include<stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
我们发现这段代码的结果是1~10之间没有5。按我们理解使用while循环应该是这样:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
但是我们发现使用while循环的结果是1 2 3 4。对于while循环来说,遇到continue不执行循环内continue后面的代码,自然i++也就不会被执行,对于这段代码来说是跳过了输出和i++两行代码,重新回到循环开始。而对于for循环来说,i++没有被跳过,因为它不在循环体内,画个图说一下for循环的流程:
简单说就是在while循环中continue会将调整表达式跳过,而在for循环中不会,因为它不在循环体内。
表达式
for 循环中的任何表达式都可以省略,但是分号必须保留。
省略示例:
#include<stdio.h>
int main()
{
for (; ; )
{
printf("hello\n");
}
return 0;
}
初始化表达式
初始化表达式是左括号后紧接着的表达式,可以在for循环外面进行初始化:
int i = 1;
for (; i <= 10; i++)
{
}
也可以把初始化的信息在表达式内进行赋值:
for (int i = 1; i <= 10; i++)
{
}
两种形式都可以,只是代码规范的问题,不在本文进行讨论。
建议:不要在for循环内修改循环变量,防止for循环失去控制,建议for循环中的变量取值采用前闭后开区间的写法,如下形式:
for (int i = 0; i < 10; i++)
{
}
条件判断表达式
条件判断表达式是两个分号之间的表达式,如果省略,则表示没有结束的条件,循环会一直执行下去,造成死循环:
for (int i = 0; ; i++) //没有条件表达式,造成死循环
{
}
调整表达式
执行调整表达式是右括号前紧挨着的表达式,也是可以省略的,不过可以像while循环一样将执行调整表达式放到循环体内:
for (int i = 0; i < 10; ) //没有执行调整表达式,将它放在循环体内
{
i++;
}
嵌套
for循环是可以嵌套的
// 嵌套for循环
#include<stdio.h>
int main()
{
for (int i = 0; i < 10; i++) //i循环
{
for (int j = 0; j < 10; j++) //j循环
{
printf("hello\n");
}
}
return 0;
}
这段代码执行后会输出100个hello。
简单分析一下:首先进入到 i 循环,i=0时,j 循环 10 次跳出,i++使得 i 变为1,再次 j 循环10次跳出,i++使得 i 变为2,继续 j 循环10次跳出……直到 i 不小于10时,跳出整个循环。
我们再来看这么一段代码:
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 10; i++)
{
for (; j < 10; j++)
{
printf("hello\n");
}
}
return 0;
}
我省略了两个for循环的初始化部分,结果并不是输出100个hello,而是10个。
简单分析一下:首先进入到外层循环,满足小于10的条件,进入到内层循环,循环10次,输出10次hello,这时候 j 为10,回到外层循环,i 变为1,仍满足小于10的条件,进入内层循环,但是这里省略了初始化部分,j 不再是从0开始循环,而是从上一次循环结束的10开始,不满足小于10的条件,直接跳过内层循环,不会执行 j 循环输出hello,再回到外层循环,i 变为2……直到 i 不满足小于10的条件跳出整个循环。
另外,for循环表达式可以使用多个变量来控制整个循环,比如:
for (i = 0, j = 0; i < 5 && j < 10; i++, j++)
一道面试题
// 循环多少次
#include<stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0, j = 0; j = 0; i++, j++)
{
j++;
}
return 0;
}
问循环多少次?
分析:我们知道在这段代码中 j=0 是 for 循环的条件表达式,当满足这个条件时,也就是条件为真时,进入到循环。j=0 是一个赋值表达式,将 0 赋给 j ,可以理解为条件表达式为 0,而 0 为假,所以不会执行循环,故循环 0 次。如果将 j=0 改为 j==0,则循环会执行一次,这个应该不难理解。
结语
for循环的知识介绍到这里结束了。