在前文中,我们介绍了C语言的分支(选择)结构,这里我们开始对循环结构进行详细介绍。
当条件成立的时候,执行循环体的代码,当条件不成立的时候,跳出循环,执行循环结构后面的代码。 特别要注意在循环体内应包含趋于结束的语句(即循环变量的更新),否则就可能成了一个死循环,这是初学者的一个常见错误。 给定的条件称为"循环条件",反复执行的程序段称为"循环体"。
循环结构while(当型循环)
while(循环控制条件)
{
循环体(中的语句);
使循环趋于结束的语句;
....
}
构成循环的条件:
循环控制条件:循环退出的主要依据;来控制循环何时退出。
循环体:循环过程中重复执行的代码块。
使循环趋于结束的语句:例如递增、递减、真、假等使循环条件为假的依据,使得循环结束。
示例:输出0-9十个数字。
#include <stdio.h>
int main()
{
int i = ;
while (i < 10) //循环控制条件
{
printf("%d\n", i); //循环体
i++; //使得循环趋于结束的语句
}
return ;
}
while循环流程:
while语句中的break和continue
先来介绍一下break:
#include <stdio.h>
int main()
{
int i = ;
while (i < 10)
{
if (i == 5)
break;
printf("%d ", i);
i++;
}
return ;
}
在while循环中遇到break,则终止当前while循环。当出现循环嵌套时,break只能终止当前所在的while循环。
示例:
#include <stdio.h>
int main()
{
while (1)//死循环
{
printf("这是个死循环\n");
while (1)//死循环 嵌套 死循环
{
break;//终止第二个死循环
printf("这是第二个死循环");//因为遇到break则终止当前循环 所以这一条不会打印出来。
}
}
return ;
}
#include <stdio.h>
int main()
{
int i = ;
while (i < 10)
{
if (i == 5)
continue;
printf("%d ", i);
i = i++;
}
return ;
}
有些读者朋友看到这里觉得奇了怪了,这怎么和break一样呢?
别急,我们再来一段儿代码:
#include <stdio.h>
int main()
{
int i = ;
while (i < 10)
{
i = i++;
if (i == 5)
continue;
printf("%d ", i);
}
return ;
}
这里我们对比上个代码,只是把i++挪到了if之前,效果却截然不同。
到这里有些读者朋友可能已经猜到continue的用法了,有些读者朋友可能还不确定。
这里我先摆出结论
continue在while循环中的作用是:
终止本轮次循环,也就是continue后边的代码不会运行,跟break相比,continue不是跳出循环,而是跳转到while语句的判断条件部分,进行下一次循环的入口判断。
这里笔者来解释的简单一些,不知道观察细致的读者朋友有没有发现,正常代码运行结束后是这样的。
这句话不见了。
说明代码还没有终止运行,换句话说,进入了死循环。
为什么进入了死循环呢?
因为当i++操作结束之后,i==5时,满足了if的判断条件,开始实现跳转语句continue,我们刚刚说过continue的作用:
终止本轮次循环,也就是continue后边的代码不会运行,跟break相比,continue不是跳出循环,而是跳转到while语句的判断条件部分,进行下一次循环的入口判断。
所以i等于5又一次重新进入循环,又满足if的判断条件,又一次执行continue,因为没有执行到i++,在这里陷入了死循环。
而另一段代码将i++挪到了if之前:
continue:终止本轮次循环,也就是continue后边的代码不会运行,跟break相比,continue不是跳出循环,而是跳转到while语句的判断条件部分,进行下一次循环的入口判断。
for(表达式1;表达式2;表达式3)
{
循环语句;
}
#include <stdio.h>
int main()
{
int i = ;
for (i = ; i < 10; i++)
printf("%d ", i);
return ;
}
简单解释:初始化i=0,满足i<10的判断条件,也就是流程图中的yes,进行次循环,进入循环体内执行语句,执行完成后继续执行表达式3,也就是i++,这时i=1,仍然满足判断条件,重复循环,直至i++令i=10,不满足循环条件,跳出循环。
for循环注意事项:
基本上与while一致,for(;;)是简单的死循环。
我们来对比一下for循环与while循环:
int i = ;
//实现相同的功能,使用while
i = 1;//初始化部分
while (i <= 10)//判断部分
{
printf("hehe\n");
i = i + 1;//调整部分
}
//实现相同的功能,使用for
for (i = 1; i <= 10; i++)
{
printf("hehe\n");
}
for语句中的break和continue
回到这张流程图,即使使用continue,会跳过continue以下的未被执行语句,但不会跳过表达式3,也就是不会跳过调整部分。
建议:
1. 不可在 for 循环体内修改循环变量,防止 for 循环失去控制。
2. 建议 for 语句的循环控制变量的取值采用“前闭后开区间”写法。
int i = ;
//前闭后开的写法
for(i=; i<10; i++)
{}
//两边都是闭区间
for(i=; i<=9; i++)
{}
for循环的省略
种:三条语句都省略,相当于for(;;)<==>while(1)
#include <stdio.h>
int main()
{
for (;;)//三个表达式全部省略 死循环
{
printf("坏习惯\n");
}
return ;
}
#include <stdio.h>
int main()
{
for (int i = ; ; i++)
{
printf("坏习惯\n");
}
return ;
}
#include <stdio.h>
int main()
{
int i = ;
for (; ;i++)
{
if (i == 3)
break;
printf("坏习惯\n");
}
return ;
}
#include <stdio.h>
int main()
{
for (int i = ; i < 5 ; )
{
printf("坏习惯\n");
}
return ;
}
循环结构do...while(直到型循环)(不经常使用)
do {
循环体中的语句;
使得循环趋于结束的语句;
....
} while (循环控制条件)
首先不管while中的条件是否成立, 都会执行一次"循环体"。 执行完一次循环体,接着再次判断while中的条件是否为真, 为真继续执行循环体,为假跳出循环。 重复以上操作, 直到"循环控制条件"为假为止。
示例:直到型循环:
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i < 10);
return ;
}
示例:打印0-9十个数字:
#include <stdio.h>
int main()
{
int i = ;
do
{
printf("%d\n", i);
i++;
} while (i < 10);
return ;
}
#include<stdio.h>
int main()
{
int num = ;
do
{
printf("请输入密码\n");
scanf("%d", &num);
} while (200124 != num);
printf("登陆成功\n");
}
绝大多数情况下while和do...while可以互换, 所以能用while就用while。 无论如何都需要先执行一次循环体的情况, 才使用do...while。 do...while曾一度提议废除,但是它在输入性检查方面有优点。
例如:一次跳出两层或多层循环。
多层循环这种情况使用break是达不到的。
goto 语句标号;
goto label;//示例 //可以理解为跳转到label
label://也就是跳转到这里 开始执行label:后的代码段
int main()
{
for (;;)
{
for (;;)
{
for (;;)
{
for (;;)
goto label;
}
}
}
label:
printf("跳出\n");
return ;
}
在一个循环体语句中又包含另一个循环语句,称为循环嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。
循环嵌套需要注意的事项:
++i 和 i++ 在单独使用时,都表示i=i+1
--i 和 i-- 在单独使用时,都表示i=i-1
a=++i就相当于i=i+1 , a=i; 先运算再赋值
a=i++就相当于a=i , i=i+1; 先赋值再运算
a=--i就相当于i=i-1 , a=i; 先运算再赋值
a=i--就相当于a=i , i=i-1; 先赋值再运算
对于自增和自减还有一点需要强调的是:只有“变量”才能进行自增和自减。
对于常量并没有这种写法,常量是不能自增和自减的。