在之前的文章中,我们介绍了分支结构,但是在许多问题中,仅仅有顺序与分支结构是不行的,还有一种就是循环结构。
循环结构又分为三个小的结构,while循环,for循环以及do...while循环。
循环结构都有三个基础部分:初始化部分,判断部分,调整部分。
我们还是以游戏抽奖的问题来介绍循环结构,在游戏中,我身为一名非酋,运气十分不好,经常抽不到好东西,这个时候就有一个保底机制,当抽取到达一定的次数,就能百分百获得一些好东西,今天我们就用循环来实现一个简单的保底机制。
while
基本语法结构
while (判断表达式)
{
循环语句;
}
在想要进入循环时,会先进行判断,如果判断表达式为真,就执行循环语句,循环语句结束后会回到判断语句,重新判断,循环往复,直到最后不满足循环条件,退出循环。
while循环的初始化部分其实在while循环外,判断表达式往往是与某个变量相关,所以通常需要在while循环外就将变量进行初始化,判断部分就是while循环的判断条件,调整部分被包含在循环语句内。
假设保底是80抽必定出一个好东西,而我已经抽了60抽,还是没有好东西,那我们只需要再抽20次就行,用while来实现我们剩下20抽。
int a = 60;
//初始化部分
while (a < 80)
//判断部分
{
a++;
//调整部分,每次循环就使记录次数加一
if (a < 80)
printf("未抽到\n");
else if (a == 80)
printf("恭喜你,成功抽到\n");
}
可以看到,这个厂商十分坑人,只有在最后一抽才能抽到好东西。
因为在开始抽奖的那一刻抽奖就被记录,所以a++放在前面。
for
基本语法结构
for (表达式1; 表达式2; 表达式3)
{
循环语句;
}
通过流程图看,for与while是很像的,for循环比起while循环的优点是for循环将三个基础部分集中在一起了。
在基础语法中表达式1是初始化部分,表达式2式判断部分,表达式3是调整部分,这样可以方便我们调整各各部分的内容,在while循环中,如果我们的代码写的十分复杂,可能导致后期修改的时候不好修改,而for循环就可以避免这些。
但是for与while不同的是,for循环的调整一定是在循环语句后执行的,这会导致一些与while不同的地方。
我们用for循环来实现这个保底机制应该是:
int a = 60;
for (a = 61; a <= 80; a++)
// 循环将执行20次,当a从61到80
{
if (a < 80)
printf("未抽到\n");
else if (a == 80)
printf("恭喜你,成功抽到\n");
}
因为我们执行循环时已将相当于开始抽奖了,所以在初始化时我们将抽奖的次数设置为61。
for循环还有一些特殊的地方
1.变量的定义可以在初始化部分进行,就比如上面代码中
int a = 60;
for (a = 61; a <= 80; a++)
我们可以将两句代码合并在一起:
for (int a = 61; a <= 80; a++)
2.for循环的三个部分都是可以取消的
for ( ; ; )
没错,这样写是没有语法错误的,这样写的问题是缺少判断条件,因为初始化以及调整我们可以在for的外面和循环语句内完成,但是缺少判断条件没办法在别的地方完成,这会导致死循环。
do...while...
基本语法结构
do
{
循环语句;
} while(判断条件);
do...while..循环的特点是无论如何,都会执行一次循环,它是先执行一次循环语句,再执行判断表达式,它的初始化部分也是在循环外,判断部分是while后面,调整部分在循环语句中。
因为它的特殊形式,所以它的运用场景也是最少的。
break
有些时候,我们可能会想要提前终止循环,就比如我抽到一半不想抽了,觉得今天运气不好,改天再抽,这个时候想要提前跳出循环,就要用到break。
break的作用就是永久终止循环,无论在哪个循环中,一旦遇到break,都会直接终止循环。
continue
continue的作用是终止本次循环continue后面的语句,但是在while语句跟for语句可能会不一样。
比如我们需要在屏幕上打印1到10的数字,但是不要5,我们可以创造一个循环产生1到10的数字,在循环变量为5的时候用continue跳过循环,我们分别用while和for来实现这个功能。
while
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d", i);
i++;
}
for
for (int i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d", i);
}
当我们运行程序的时候,会发现while循环的结果会是死循环,而for循环会按我们的想法打印数字。
这是为什么,在while循环中,当我们使用continue时,会跳过后面的i++,导致在在下一次循环开始时i的值依旧是5,导致死循环,而在for循环中,虽然跳过了后面的语句,但是依旧会执行for语句后面的调整部分,是i的值变化。
在do...while...循环中continue于while是一样的。