在程序中,某些代码会被一直重复循环的执行,直到满足一些条件时,就会退出,这部分的代码就包含在循环结构中。
在C语言中,循环主要有三种,for循环、while循环和do…while()循环。下面会详细介绍。
1、for()循环
2、while()循环
3、do...while()循环
在介绍循环之前,先说明在C语言中对真假的判断。循环是在满足条件为真时,就会退出循环,所以知道对真假的判断就十分重要。在C语言中:
1、非零即真
2、0为假
#include
int main(){
int num1 = 5; // 5为非零数,则为真。-5时同样的结果
int num2 = 0; // 为0则为假
int num3 = num1 && num2; // 逻辑与同为真时则为真,有一个为假则为假,所以结果为 0
int num4 = num1 || num2; // 逻辑或同为假时则为假,有真则为1,所以输出结果为 1
printf("%d\n", num3); // 结果为:0
printf("%d", num4); // 结果为:1
return 0;
}
for(exp1; exp2; exp3){
statement
}
for循环后面的圆括号中有3个表达式,分别用分号隔开。其中:
1、表达式1是初始化,只会在for循环开始时执行一次。
2、表达式2是测试条件,在执行循环之前对表达式求值。如果表达式为假,则循环结束。
3、表达式3是执行更新,在每次循环结束时求值。
# include
int main(void)
//1-10的加法
{
int i; // 定义i变量
int sum = 0; // 定义并初始化求和结果的变量
for (i = 1; i <= 10; i++)//i=1为初始化i变量的值,i<=10为测试条
//件,在本例中当i=11时,表达式2为假,则跳出循环。i++为执行循环的更新
//条件,执行一次循环,i+1
sum = sum + i;
printf("sum = %d", sum);
return 0;
}
# include
int main(void)
{
int i;
int sum = 0;
// 同上,当表达式3为i+=2时,循环每次的更新条件为i+2,就会过滤掉偶
// 数,从而奇数相加
for (i = 1; i <= 10; i+=2)
sum = sum + i;
printf("sum = %d", sum);
return 0;
}
# include
int main(void)
{
int i;
int sum = 0;
for (i = 1; i <= 100; ++i)
// if判断1-100之间的数,只有能被3整除时,才会被相加
if (i % 3 == 0)
sum = sum + i;
printf("sum = %d\n", sum);
return 0;
}
#include
// 求1-100之间的奇数之和,奇数的个数,奇数的平均值
int main(void)
{
int i, j = 0, sum_j = 0;
float aver_j;
for (i = 1; i <= 100; ++i)
if (i % 2 != 0)
{
sum_j = sum_j + i;
j++;
aver_j = sum_j / j;
}
printf("奇数个数为:%d 奇数之和为:%d 平均值为:%f\n", j, sum_j, aver_j);
}
#include
int main(void)
// 1+1/2+...+1/100
{
int i;
float sum = 0;
for (i = 1; i <= 100; ++i)
{
sum = sum + 1 / (float)(i);//也可以写为sum = sum + 1.0/ i
}
printf("%f\n", sum);
return 0;
}
for循环里面在套一层for循环,就构成了for循环嵌套。
结构示例:
for (int i = 0; i < count; i++) // 外层for循环
{
for (int j = 0; j < count; j++) //内层for循环
{
/* code */
}
}
#include
int main(){
int i, j;
for (int i = 1; i < 10; i++) // 外层循环
{
for (int j = 1; j <= i ; j++) // 内层循环
{
printf("%d * %d = %d\t", i, j, i*j);
}
printf("\n");
}
return 0;
}
while ( expression){
statement
}
1、statement部分可以是分号结尾的简单语句,也可以是花括号括起来的符合语句
2、如果expression为真,执行statement部分一次,然后再次判断expression。在expression为假之前,循环的判断和执行一直重复执行。每一次的循环称为一次迭代
3、while循环有一点非常重要:在构建while循环时,必须让测试表达式有所变化,表达式最终为假,否则,循环就不会终止。
#include
int main(void)
{
// 定义自增变量
int i = 1;
// 定义求和结果变量
int sum = 0;
// while循环
while (i < 101)
{
sum = sum + i;
// 自增变量
++i;
}
printf("sum = %d", sum);
return 0;
}
for(exp1; exp2; exp3){
statement
}
等价于:
exp1;
while(exp2){
statement;
exp3;
}
while和for可以相互转化,但for的逻辑性更强,更不容易出错,推荐多使用for。
for循环和while循环都是入口条件循环,即在循环的每次迭代之前检查测试条件,所以有可能根本不执行循环体中的内容。C语言还有出口条件循环,即在循环的每次迭代之后检查测试条件,这就保证了至少执行循环体中的内容一次。这种循环称为do…while循环。
do
{
statement;
}while(expression);
#include
int main(){
// 定义并初始化只读变量
const int secret_code = 11;
// 定义输入的变量
int enter_code;
do
{
// 先打印输出语句
printf("please enter secret code:");
// 接收键盘输入的数字
scanf("%d", &enter_code);
// 判断输入的数字是否和规定的相同,如果不相同,执行循环,如果相同,打印输出内容
} while (secret_code != enter_code);
printf("Congulation!");
return 0;
}
do…while并不等价于for,也不等价于while。
一般而言,程序进入循环后,在下一次循环测试之前会执行完循环体中的所有语句。continue和break可以根据循环体中的测试结果来忽略一部分循环内容,甚至结束循环。
程序执行到循环中的break语句时,会终止包含它的循环,并执行下一阶段的程序。
#include
int main(){
int ret = 3;
for(int i = 0; i < 5; i++){
// 判断i的值是否等于ret,如果等于则跳出循环
if (i == ret)
{
break;
}
printf("hello world\n"); // 输出三句hello world
}
return 0;
}
1、break如果用于循环是用来终止循环。
2、break如果用于switch,则是用来终止switch。
3、break不能直接用于if,除非if属于循环内部的一个子句。
4、在多层循环嵌套中,break只能终止距离它最近的循环。
3种循环都可以使用continue语句。执行到该语句时,会跳过本次迭代的剩余部分,并开始下一轮迭代。如果continue语句嵌套在循环内,则只会影响包含该语句的内层循环。
#include
int main(){
for(int i = 0; i <= 5; i++){
// 当i等于3时,跳过i=3的本次循环
if (i == 3)
{
continue;
}
printf("i=%d hello world\n", i);
}
return 0;
}
// 输出结果:
// i=0 hello world
// i=1 hello world
// i=2 hello world
// i=4 hello world
// i=5 hello world
#include
int main(){
int i = 0;
while (i < 5)
{
// 当i=3时跳过本次循环,但注意,在跳过之前需要将i+1,
// 否则i会始终等于3,而不能退出循环
if (i == 3){
i++;
continue;
}
printf("i=%d Hello world\n", i);
i++;
}
return 0;
}