循环语句中有三种:for循环,while循环,do-while循环。while语句的语法结构和if语句的非常相似。
1.1 if和while的对比
if (表达式)
语句;
while(表达式)
语句;
下来我们写两个代码,观察以下这两个相似的语句。
可以看到,if语句是正常打印出来的,whlie语句进入了死循环。这是因为,if语句只进行判断,1是非0就打印了,而while语句是循环的,1是非0可以一直进入语句,打印出来的也就是死循环了。
注:while语句也是只能写一条语句,如果要多写,要加上大括号。
1.1while 循环的执行流程
⾸先上来就是执⾏判断表达式,表达式的值为0,循环直接结束;表达式的值不为0,则执⾏循环语 句,语句执⾏完后再继续判断,是否进⾏下⼀次判断。
1.3 while循环的实践
练习:在屏幕上打印1-10的值
int main()
{
int i = 0;
while (i <= 10)
{
printf("%d ", i);
i++;
}
return 0;
}
为了让整个循环发生变化,需要i++,比如 i=1;1<=10是成立,进入语句,打印 i=1,再执行下一句 i++,i变成2,再进行判断,i=2 ,是小于等于10的,再继续,知道i=10,循环结束,屏幕上打印出了1-10.
练习:输入一个正的整数,逆序打印这个整数的每一位。
例如:
输入:1234;打印出 :4 3 2 1
int main()
{
int i = 0;
scanf("%d", &i);
while (i)
{
printf("%d ", i%10);
i = i / 10;
}
return 0;
}
2.for循环
2.1 语法形式
for 循环是三种循环中使用最多的,形式如下:
for(表达式1;表达式2;表达式3)
语句;
表达式1 用于循环变量的初始化
表达式2 用于循环结束的判断
表达式3 用于循环变量的调整
这同while语句是非常相似的,while语句中
⾸先执⾏ 表达式1 初始化循环变量,接下来就是执⾏ 表达式2 的判断部分, 表达式2 的结果如果 ==0,则循环结束; 表达式2 的结果如果!=0则执⾏循环语句,循环语句执⾏完后,再去执⾏表 达式 3 ,调整循环变量,然后再去 表达式2 的地⽅执⾏判断, 表达式2 的结果是否为0,决定循环是否继 续。 整个循环的过程中,表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循环。
2.3 for循环的实践
练习:在屏幕上打印1~10的值
int main()
{
int i = 0;
for (i = 1//初始化; i <= 10//判断; i++//调整)
{
printf("%d ", i);//打印
}
return 0;
}
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是 for 循环的三个部 分⾮常集中,便于代码的维护,⽽如果代码较多的时候 while 循环的三个部分就⽐较分散,所以从形 式上 for 循环要更优⼀些。
练习:计算1-100之间3的倍数的数字之和。
首先,我们来分析,第一个条件是1~100的数字,可以使用 for循环或者 while循环,第二个条件是3的倍数,可以使用 i %3==0来实现,第三个条件是求和,把3的倍数找出来之后再加起来就可以了。
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 3 == 0)
{
sum = sum + i;
}
}
printf("%d\n",sum);
return 0;
}
可以再优化一下,再调整阶段产生的就是散倍数,将初始化的变为3,每次加3.
//}
int main()
{
int i = 0;
int sum = 0;
for (i = 3; i <= 100; i+=3)
{
if (i % 3 == 0)
{
sum = sum + i;
}
}
printf("%d\n", sum);
return 0;
}
3.do-while 循环
3.1 语法形式
在循环语句中 do-while语句使用的最少,它的语法如下:
do
语句;
while(表达式);
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳 出循环;
⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表 达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
do while 循环的特点就是至少被执行一次。
3.2 do while 循环的执行流程
在 do while 循环中先执⾏图上的“语句”,执⾏完语句,在去执⾏“判断表达式”,判断表达式的 结果是!=0,则继续循环,执⾏循环语句;判断表达式的结果==0,则循环结束。 所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅
3.3 do while循环的实例
在屏幕上打印1~10的值
int main()
{
int i = 1;
do
{
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
练习:输入一个正整数,计算这个整数是几位数?
一个数字至少要是一位,所以在加位数时,先加。
int main()
{
int i = 0;
int sum = 0;
scanf("%d", &i);
do
{
sum++;
i = i / 10;
} while (i);
printf("%d", sum);
return 0;
}
这⾥并⾮必须使⽤ do while 语句,但是这个代码就⽐较适合使⽤ do while 循环,因为n即使是 0,也是1位数,要统计位数的。
4. break和 continue 语句
在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。C语⾔中 提供了 break 和 continue 两个关键字,就是应⽤到循环中的。
• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执 ⾏。
• continue 的作⽤是跳过本次循环中 continue 后边的代码,在 for 循环和 while 循环中有 所差异的。
4.1 while循环中的 break和 continue
我们可以看看我们上面写的代码,来观察break 和 continue。
我们可以清楚的观察到,使用break语句后,4以后的数字就没有再打印了。当i等于5后,就执⾏break,循环就终⽌了。
打印了1,2,3,4后,当i等于5的时候,循环在 break 的地⽅终⽌,不再打印,不再循环。 所以 break 的作⽤就是永久的终⽌循环,只要 break 被执⾏, break 外的第⼀层循环就终⽌了。 那以后我们在循环中,想在某种条件下终⽌循环,则可以使⽤ break 来完成我们想要的效果。
那么当我们把break 换成continue 结果会发生什么变化呢?
结果是死循环了,因为continue可以帮助我们跳过这次循环continue后面的代码,但是在该代码中,while循环的调整 i++在continue的后边,随着continue执行,代码不执行i++语句,所以 i一直在这个循环中跳出,就成了死循环。
到这⾥我们就能分析出来, continue 可以帮助我们跳过某⼀次循环 continue 后边的代码,直接 到循环的判断部分,进⾏下⼀次循环的判断,如果循环的调整是在 continue 后边的话,可能会造成 死循环。
让我们把调整部分放在前面,把代码进行优化,看看最后打印出的结果是什么。
因为进入while循环后,直接i++所以,先打印出的就是2。就可以观察,代码结果跳过了5。
4.2 for 循环中的break 和 continue
其实和 while 循环中的 break ⼀样, for 循环中的 break 也是⽤于终⽌循环的,不管循环还需 要循环多少次,只要执⾏到了 break ,循环就彻底终⽌。
我们还是使用上面写过的代码:
break 的作⽤是永久的终⽌循环,未来我们在某个条件发⽣的时候,不想再继续循环的时候,就可以 使⽤ break 来完成。
接下来,看看变为continue是什么样的结果。
所以在 for 循环中 continue 的作⽤是跳过本次循环中 continue 后的代码,直接去到循环的调 整部分。未来当某个条件发⽣的时候,本次循环⽆需再执⾏后续某些操作的时候,就可以使⽤ continue 来实现。
大家可以自己去总结一下在for循环中使用 break 和 continue 的区别
4.3 do while循环中的break和continue
do.while 语句中的 break 和 continue 的作⽤和 while 循环中⼏乎⼀模⼀样,⼤家下来可以 ⾃⾏测试并体会。
可以观察出 break在do while循环中没有什么特别的,只打印了1 2 3 4.
可以看到continue循环的结果是死循环,调整在continue后,就死循环了。
5.练习
找出100~200之间的素数,并打印在屏幕上。
注:素数⼜称质数,只能被1和本⾝整除的数字。
分析:
1. 要从100~200之间找出素数,⾸先得有100~200之间的数,这⾥可以使⽤循环解决。
2. 假设要判断i是否为素数,需要拿2~i-1之间的数字去试除i,需要产⽣2~i-1之间的数字,也可以使⽤ 循环解决。
3. 如果2~i-1之间有数字能整除i,则i不是素数,如果都不能整除,则i是素数。
#include<stdio.h>
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1;//假设i是素数。
//每次循环产生一个i
//判断i是否是素数
//使用循环产生2~i-1之间的数字
int j = 0;
for (j = 2; j <= i - 1; j++)
{
if (j % i == 0)//如果等于说明i不是素数,所以要让flag等于0,因为我们前面假设的是flag是素数的情况。
{
int flag = 0;//改成了假
break;//判断玩不是素数,直接跳出循环,因为后面的没有必要再判断了,跳出循环。
}
}
if (flag == 1)//这个就是上面没有一个i可以把j整除了,也不会进入循环把flag改为0,所以flag还是真,就是素数
{
printf("%d ", i);
}
}
return 0;
}
可以看看,我在代码中写的写的注释,可以帮助大家理解。
大家可以思考一下,偶数可不可能是素数?
答案是不可能,因为一定会被2整除,所以我们可以进行优化:
for (i = 101; i <= 200; i+=2)
将i初始化为101,每次加2,这样代码的效率会提高很多。
6. goto语句
C语⾔提供了⼀种⾮常特别的语法,就是 goto 语句和跳转标号, goto 语句可以实现在同⼀个函数 内跳转到设置好的标号处。
例子:
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
goto 语句如果使⽤的不当,就会导致在函数内部随意乱跳转,打乱程序的执⾏流程,所以我们的建 议是能不⽤尽量不去使⽤;但是 goto 语句也不是⼀⽆是处,在多层循环的代码中,如果想快速跳出 使⽤ goto 就⾮常的⽅便了。