C语⾔是结构化的程序设计语言,这里的结构指的是顺序结构、分支结构、循环结构。
我们今天要讲的是循环语句while、for、do while。
目录
1.while循环语句
1.1 while 和 if的对比
1.1.1语法结构
if(表达式)
语句;
while(表达式)
语句;//如果循环体有多个语句,要有程序块{}括起来
while表达式为真,循环执行对应语句,直到不满足限制条件。
1.1.2实例
#include <stdio.h>
int main()
{
if(1)
printf("hehe\n");
//if表达式为真,结果:hehe
return 0;
}
#include <stdio.h>
int main()
{
while(1)
printf("hehe\n");
//while表达式为真,结果为无限循环打印hehe
return 0;
}
1.2 while的语法的执行流程
while语句,
1.进入判断表达式,判断为真,进入循环。
2.执行语句,1通过continue进入新的一轮循环,2执行完while剩下的语句后进入新的一轮循环,3通过break可以跳出循环
3.如果判断表达式为真,进入循环,为假,跳出循环
1.3 while循环的实践
题目:在屏幕上打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
printf("%d\n",i);
//每次打印完之后,i自己加上1。
i = i + 1;
}
return 0;
}
每次打印完,i就会加1,直到 i =11的时候就会跳出循环
1.4 while和break在while语句中
while循环中,
break用于永久终止循环
continue跳过本次循环后面的代码,直接去判断部分,进行下一次的判断
1.4.1 break 在while语句中
看下面代码的运行结果?
int main()
{
int i = 1;
while(i<=10)
{
i++;
if(5==i)
break;
printf("%d ",i);
}
return 0;
}
i=1进入循环,i++就是 i=i+1 , i = 2 , 打印2
i=2进入循环,i++ , i=3,打印3
i=3进入循环,i++ , i=4,打印4
i=4进入循环,i++ , i=5,break直接跳出循环,结束。
1.4.2 while在while语句中
看这个代码的结果是什么:
int main()
{
int i = 1;
while(i<=10)
{
i++;
if(5==i)
continue;
printf("%d ",i);
}
return 0;
}
i=1进入循环,i++就是 i=i+1 , i = 2 , 打印2
i=2进入循环,i++ , i=3,打印3
i=3进入循环,i++ , i=4,打印4
i=4进入循环,i++ , i=5,continue跳过本次循环,判断为真,再次进入循环
i=5进入循环,i++ , i=6,打印6
i=6进入循环,i++ , i=7,打印7
i=7进入循环,i++ , i=8,打印8
i=8进入循环,i++ , i=9,打印9
i=9进入循环,i++ , i=10,打印10
i=10进入循环,i++ , i=11,打印11
i=11,表达式判断为假跳出循环。
int main()
{
int i = 1;
while(i<=10)
{
if(5==i)
continue;
printf("%d ",i);
i++;
}
return 0;
}
当 i=5时,continue跳过后面的代码,进入新的一轮循环
又遇到continue,跳过后面的代码,进入新的一轮循环
所以就死循环了
1.5 while语句的练习
题目:输入一个正的整数,逆序打印这个整数的每一位
例如:
输入:1234,输出:4 3 2 1
输入:521,输出:1 2 5
解题思路:想要一位一位地打印,只要把该整数的每一位提取出来就可以了,
- 1234提取4,1234 % 10 = 4 ,
- 123提取3,123 % 10 = 3,
- 12提取2,12 % 10 = 2,
- 1提取1,1 % 10 = 1;
- 然后我们的问题转换成了,怎么提取123,12,12,其实简单,只要把1234 / 10 =123, 123 / 10 =12, 12 / 10 =1;
我们来看实现代码:
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d",&n);
while(n)
{
printf("%d ",n%10);
//下面等同于n=n/10;
n /= 10;
}
return 0;
}
2.for循环语句
2.1 for循环的语法形式
for循环的语法形式:
for(表达式1;表达式2;表达式3)
语句;//如果循环体有多个语句,要有程序块{}括起来
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
表达式与表达式之间用 ;来隔开
2.2 for循环的执行流程
表达式1 初始化
表达式2 判断,判断决定进入循环与否
表达式3 改变变量的值
2.3 for循环实践
题目:打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
for(i=1;i<=10;i++)
{
printf("%d ",i);
}
return 0;
}
我们来对比一下 for 循环和 while 循环
for循环
1.初始化 i=0 ;
2.改变循环变量的值,i++ 来代替了 i = i + 1;
不变的是:
判断条件的存在: i<=10
#include <stdio.h>
int main()
{
int i = 0;
while(i<=10)
{
printf("%d\n",i);
//每次打印完之后,i自己加上1。
i = i + 1;
}
return 0;
}
2.4 break和continue在for循环中
2.4.1 break在for循环中
break在for循环中,会直接跳出循环体
#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 的时候,break直接跳出循环就只打印1 2 3 4.
2.4.2 continue在for循环中
下面的结果是什么?
#include<stdio.h>
int main()
{
int i=0;
for(i =1; i<=10;i++)
{
if(i==5)
continue;
printf("%d ",i);
}
return 0;
}
continue的作用就是跳过本次循环后面的代码,继续进入新的循环
根据for的执行流程,continue会跳过后面的printf("%d ",i),进入表达式3,对 循环变量 i 的值进行改变,然后进入表达式2判断,最后这次进入循环体。
总结:continue跳过本次循环,break永久跳出循环。
2.5 for语句的循环控制变量
建议:
1.不可在for循环体内修改循环变量,防止for循环失去控制
#include<stdio.h>
int main()
{
int i=0;
for(i =1; i<=10;i++)
{
printf("%d ",i);
i = 12;
}
return 0;
}
2.建议for语句的循环控制变量的取值采用“前闭后开区间”写法
int i = 0;
//前闭后开的写法
for(i=0;i<10;i++)
{}
//两边都是闭区间
for(i=0;i<=9;i++)
{}
看下面的例子,我们看到 i<10,10为arr数组的元素个数,如果改成i<=9,9是没有任何意义的。
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
int i=0;
1| for(i=0;i<10;i++)
{
printf("%d ",arr[i])
}
2| for(i=0;i<=9;i++)
{
printf("%d ",arr[i])
}
3| for(i=100;i<=200;i++)
{
printf();
}
return 0;
}
而3|循环中我们用闭区间,我们发现无论是闭区间还是开区间,其实是为了将限制条件更好地理解,哪个有意义我们就选择哪个。
2.6 for 循环的变种
for循环中的初始化有些情况可以省略,比如:前面有 i 的初始化
int main()
{
int i = 0;
for(i=0;i<10;i++)
{
printf("hehe\n");
}
return 0;
}
int main()
{
int i = 0;
for(;i<10;i++)
{
printf("hehe\n");
}
return 0;
}
for循环中,一些情况,初始化是不能省略的,比如:下面关于变量是 j 的循环需要进行三次,必须要重新初始化才能再打印3次hehe。
int main()
{
int i = 0;
int j = 0;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
printf("hehe\n");
}
}
return 0;
}
int main()
{
int i = 0;
int j = 0;
for(;i<3;i++)
{
for(;j<3;j++)
{
printf("hehe\n");
}
}
}
C99标准才能支持的写法 :将 i 的定义写在for循环中(MSVC编译器是不支持的)
int main()
{
for(int i=0;i<10;i++)
{
printf("hehe\n");
}
return 0;
}
使用多余的一个变量来控制循环
int main()
{
int x,y;
for(x=0,y=0;x<2 && y<5;++x,y++)
{
printf("hehe\n");
}
return 0;
}
2.7 一道笔试题
请问循环多少次
#include<stdio.h>
int main()
{
int i = 0;
int k = 0;
for(i=0,k=0;k=0;i++,k++)
k++;
return 0;
}
答案:循环0次,因为表达式2的 = 并不是判断,而是赋值,k=0是判断为假,不进入循环。
- 在C语言中,0表示假,非零表示真。
3.do while语句
3.1 do while的语法结构
do
循环语句;//语句多的时候我们要用程序块{}将语句括起来
while(表达式);
3.2 do while的执行流程
与whlie不同的是:条件表达式在循环体之后,我们无论循环变量符不符合条件,我们都会先进入循环。
3.3 do while实践
题目:打印1~10的值
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ",i);
i = i + 1;
}while(i<=10);
return 0;
}
3.4 do while练习
下面代码的打印结果是什么呢?
#include<stdio.h>
int main()
{
int i = 1;
do
{
i++;
if(i==5)
continue;
printf("%d ",i);
}while(i<=10);
return 0;
}
i=1进入循环,i++就是i=i+1,i=2,轮个打印,当 i=5 的时候,continue跳过下面的打印,进入下一次的循环,然后 i=6,7,8,9,10,11. 11打印完后进行判断才不成立,跳出循环。
下面这个代码的打印结果为多少呢?
#include<stdio.h>
int main()
{
int i = 1;
do
{
if(i==5)
continue;
printf("%d ",i);
i++;
}while(i<=10);
return 0;
}
i=1进循环,打印 1,然后再加1.
i=2进循环,打印 2,然后再加1.
i=3进循环,打印 3,然后再加1.
i=4进循环,打印 4,然后再加1.
i=5进循环,continue跳出循环
i=5进循环,continue跳出循环
i=5进循环,continue跳出循环
所以结果为1 2 3 4 (死循环)