[简明C语言]分支和循环P_4:循环 - for语句
前言
第二章:分支和循环
循环语句,是用于重复执行某条语句的语句。
for循环语句的循环方式为利用一个条件来控制是否要继续反复执行这个语句,它是计算机的一种基本循环模式。当满足条件时进入循环,不满足跳出。
1. for语句
上一部分详细讲解了while循环,介绍了为什么需要for循环。
首先通过一段伪代码看一下for循环的语法:
for(表达式1;表达式2;表达式3)
循环语句;
表达式1为初始化部分,用于初始化循环变量。 表达式2为条件判断部分,用于判断循环什么时候终止。 表达式3为调整部分,用于循环条件的调整。
来看一段实际应用。
使用for循环打印1-10十个数字:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
运行结果: 可以看到成功打印出了1-10十个数字。
执行流程图
for语句执行的流程: 可以发现,表达式1,即初始化部分在整个流程中只被执行了1次。
对比for循环和while循环。
看下面两段代码:
int i = 0;
i = 1;
while(i <= 10)
{
printf("%d ", i);
i = i + 1;
}
for(i = 1; i < 11; i++)
{
printf("%d ", i);
}
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。
所以,for循环的风格更胜一筹;for循环使用的频率也最高。
break关键字
在上述例子中,加入break关键字:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
break;
}
printf("%d ", i);
}
return 0;
}
运行结果 i = 5的时候终止循环,打印出1,2,3,4。
只要break被执行,循环终止。
continue关键字
在上述例子中,加入continue关键字:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
return 0;
}
运行结果: 可以发现打印结果跳过了5,打印出1,2,3,4,6,7,8,9。 并没有像while循环中出现死循环的情况。
这是因为for循环的调整部分不会被continue 跳过。
在continue跳过打印5之后,仍会执行i++,此时i = 6,不会陷入死循环。
while循环 中的continue 跳过剩余部分后,有可能跳过调整部分; for循环 中的continue 跳过剩余部分后,直接跳至调整部分。
2. for语句的循环控制变量
一些建议:
- 不可在for循环体内修改循环变量,防止for循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
建议1
尽量不要在for循环体内修改循环变量。 如果将上述代码修改为:
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
i = 5;
}
return 0;
}
运行发现“: 出现了死循环!
在内部修改了循环变量,使代码“走不出去”。
所以尽量不要在循环体内修改循环变量(包括嵌套)。
建议2
尽量for语句的循环控制变量的取值采用“前闭后开区间”写法。
前闭后开区间:
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 1; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
前后闭区间:
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int i = 0;
for (i = 1; i <= 9; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果都是一样的: 但是更建议写成前闭后开区间形式: 这里的10意味着循环了10次,代码风格和可读性更好。
3. for循环的变种
变种1
#include <stdio.h>
int main()
{
for (;;)
{
printf("666\n");
}
return 0;
}
运行结果为: 可见在循环打印。
由此可见for循环的初始化、条件判断和调整部分都是可以省略不写的。
但是判断部分的省略意味着判断部分恒为真,即陷入死循环。
变种2
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("666\n");
}
}
return 0;
}
运行结果: 外循环3次,内循环3次,共打印9次。
如果省略初始化部分,那么将打印几次呢?
#include <stdio.h>
int main()
{
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("666\n");
}
}
return 0;
}
运行结果: 只打印了3次,为什么呢?
这是因为i = 0执行第一次外循环时,直到内循环的j = 3 时将跳出内循环。
然后i = 1执行第二次外循环时,由于没有初始化j,导致j = 3 不满足循环的条件。
所以只执行了一次外循环!只打印了3次。
不要随便省略初始化!!
变种3
#include <stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("666\n");
}
return 0;
}
运行结果 可以发现,使用两个循环变量来控制变量也是可以的。
4. 题目
请问循环要循环多少次?
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i = 0, k = 0; k = 0; i++, k++)
{
k++;
}
return 0;
}
代码中条件判断部分k = 0 是赋值! 代表着把0 赋值给k ! 0为假!
因为条件判断部分为假!! 所以根本没有进入循环!!
总结
本文详细介绍了循环语句中的for语句,对循环语句有一个深入的了解。
|