如果我们要输出 10 次 hello 怎么办?10 万次呢?
在开发中经常需要处理重复问题, 例如:
(1) 计算 1 到 10 的和。 (重复 10 次加法操作)
(2) 输出 50 个学生的成绩 (重复 50 次输出操作)
为了解决这种问题,C 语言提供了以下 3 种循环语句来实现循环结构:
(1) while 循环语句
(2) do…while 循环语句
(3) for 循环语句
下面将依次介绍这 3 种循环语句。
(一) while 语法
while 语句的一般形式为:
while(表达式)
{
循环语句
}
【说明】
(1)while 后面的语句可以是单行语句,也可以是使用“{ }”括起来的复合语句,这些语句是 while 循环的循环体。
(2)while 小括号中的表达式一般是关系表达式或逻辑表达式,用来控制循环体执行的次数。当表达式值为“真”(非 0),就执行循环体,当表达式为“假”(0),就不执行循环体。这种控制循环体执行的表达式也被称为“循环条件表达式”,简称为“条件表达式”。
(3)while 循环执行特点是:先判断条件表达式,后执行循环体,执行完循环体再判断条件表达式……
打印 3 次字符串“hello world”
#include<stdio.h>
int main(void)
{
int i=0;
while(i<3) //i<3 为真执行循环体,为假不执行循环体
{ //循环体开始
printf("%s
","hello world");
i++;
} //循环体结束
printf("while 结束,i=%d
",i);
getchar();
return 0;
}
//常见错误:别忘了写 i++
(二) do…while 循环语句
do…while 语句与 while 语句实现的功能相同,只是循环体执行的顺序不同而已。该语句的一般形式为:
do{
循环语句;
}while(表达式);
while 语句是先执行条件表达式,根据表达式的结果再决定是否执行循环体。而 do…while语句是先执行一次循环体,然后执行条件表达式,根据表达式的结果再决定是否执行下一次循环。
打印 3 次字符串“hello world”
#include<stdio.h>
int main(void)
{
int i=0;
do
{
printf("%s
","hello world");
i++;
}while(i<3);
getchar();
return 0;
}
while 和 do…while 的区别:do…while 的循环体至少执行一遍。do…while 用的比较少。
(三) for 循环语句
C 语言还提供了 for 语句实现循环。for 循环十分灵活,并且也是编程中使用最多的循环语句。
for 循环的一般形式为:
for(表达式 1; 表达式 2; 表达式 3)
{
循环语句;//循环体
}
for 循环的执行流程为:
(1)先执行表达式 1,只会执行一次。
(2)执行表达式 2,如果该表达式 2 结果为真,执行 for 循环体,然后执行下面第(3)步。如果为假,直接结束 for 循环。
(3)执行表达式 3,然后跳到第(2)步重新执行。
打印 0 到 3。
#include<stdio.h>
int main(void)
{
int i;
for (i = 0; i <= 3; i++)
{
printf("%d
",i);
}
getchar();
return 0;
}
(四) for 循环的特殊写法
for(表达式 1 ; 表达式 2 ; 表达式 3)
{
语句
}
for 循环中的表达式 1、表达式 2、表达式 3 都可以省略。表达式 1 省略表示“循环开始前啥都不干”,表达式 3 省略表示“循环体执行后啥也不干”,表达式 2 省略表示 1(真)。
例子:在 for 循环外部完成循环变量的初始化。
#include<stdio.h>
int main(void)
{
int x=0; //定义变量 i 并初始化
for ( ; x<3 ; x++) //缺省表达式 1
{
printf("i=%d ",x);
}
getchar();
return 0;
}
例子:在循环体中修改循环变量。
#include
int main(void)
{
int i=0;
for(; i<3 ;)
{
printf("i=%d
",i);
i++; //变量 i 自增 1
}
getchar();
return 0;
}
例子:无限循环(死循环)
for(;;)
{
printf("hello world
");
}
(五) for 循环嵌套
循环中包含循环就叫做循环的嵌套有些问题只用一层循环是解决不了的,必须使用多层循环解决,即循环嵌套。
三种循环(while、do…while、for)可以相互嵌套,不过使用最多的是 for 循环嵌套。
就像我们从 1 日循环到 30 日,然后每天还有 0 点到 23 点的小循环一样。
for 循环嵌套的一般形式为:
上述这种形式属于二层 for 循环嵌套,内部的 for 循环被称为内层循环,外部 for 循环被称为外层循环。
for 循环执行的流程为:
外层循环执行 1 次,内层循环执行 n 次(n 表示内层循环结束条件),当外层循环结束时,整个循环嵌套都结束,包括内层循环。
下面通过例子来理解一下 for 循环嵌套的使用。
二层 for 循环嵌套
#include<stdio.h>
int main(void)
{
int x; //定义外层循环变量 x
int y; //定义内层循环变量 y
for (x=0;x<3;x++) //外层 for 循环
{
printf("x=%d
",x);
for (y=0;y<3;y++) //内层 for 循环
{
printf("y=%d ",y);
}
printf("
"); //换行
}
getchar();
return 0;
}
(六) 改变循环执行状态
使用循环的时候,有时需要提前终止循环执行,为了解决这种问题,C 语言提供了 break语句和 continue 语句,他们都可以和 while、do while、for 一起用。
1. break 语句
前面在多分支选择语句 switch 中应用过 break 语句,作用是强制跳出 switch 语句。在循环语句中也可以应用 break 语句,作用是强制跳出循环、结束循环。
【说明】
(1)break 语句在 C 语言中,只能应用在 switch 和循环语句中,不能应用与其他任何语句中。
(2)break 语句的功能只有两个,强制跳出 switch 和循环。
下面通过例子来了解 break 语句在循环中的应用。
#include<stdio.h>
int main(void)
{
int i=0;
while(i<5)
{
if (i==3)
{
break; //结束循环 break 和 continue 可以放到{}中,也可以不放,看个人习惯
}
printf("i=%d
",i);
i++;
}
getchar();
return 0;
}
break 也可以和 for 一起用。
#include<stdio.h>
int main(void)
{
int i;
for (i = 0; i < 5; i++)
{
if (i==3)
{
break; //结束循环
}
printf("i=%d
",i);
}
getchar();
return 0;
}
2. continue 语句
有时候在程序中并不希望终止整个循环,而是只希望终止本次循环后面的代码,下一次的循环接着执行, 可以使用 continue 语句。
例子,输出 10 以内不能被 2 整除的整数。
#include<stdio.h>
int main(void)
{
int i;
for (i=0; i<10; i++)
{
if (0==i%2)
{
continue; //终止本次循环
}
printf("i=%d
",i);
}
getchar();
return 0;
}
3. break 与 continue 语句对比
(1)break 语句的功能是强制跳出整个循环。当循环中出现 break 语句时,该循环就有 2个终止条件:一个循环条件为假,另一个是执行了 break 语句。
(2)continue 语句的功能是强制跳出本次循环。当循环中出现 continue 语句时,该循环仍然只有 1 个终止条件:循环条件为假。也就说 continue 语句并不会影响循环的正常终止,只是 continue 后面的语句会被跳过,从下一次循环开始执行。
注意,在嵌套循环中,break、continue 操作的是“离自己最近的外层循环”。