哈喽小伙伴们好久不见,今天我们继续探讨分支与循环中的循环部分~~
目录(上)
操作符
分支语句
目录(下)
循环语句
练习
一、循环语句
在我们C语言中,一共提供了三种循环语句,分别是while循环、do-while循环和for循环,我们今天就来分别探讨一下这三种循环结构
(一)while循环
在这之前,我们先来复习一下分支结构中的if语句。对于if语句,语法结构是这样的:
if(表达式)
语句;
只要满足表达式的条件,就执行下面的语句。那同样的,while循环也是如此。下面我们来看while循环的语法结构:
while(表达式)
语句;
那既然if和while的用法相似,那如果我们用while和if写同一段代码,会发生什么呢?我们先来看if语句写的代码:
#include<stdio.h>
int main()
{
if(1)
printf("hehe\n");
return 0;
}
运行的结果显而易见,就是一个“hehe”,那while语句会是什么呢?
#include<stdio.h>
int main()
{
while(1)
printf("hehe\n");
return 0;
}
我们可以看到,只要while后面的条件满足,语句就会一直执行下去。也就是说会一直不停的打印“hehe”,那么这时候我们就会需要跳出循环,这个我们讲完循环之后再说。
(二)do-while循环
我们都知道,在while循环中,程序会先判断条件是否满足,来判断是否执行语句。然而在do-while循环中,是先通过“do”,再来“while”。也就是说,先执行语句,然后根据执行后的结果来判断while后的条件,如果满足则继续执行“do”,不满足则跳出循环。do-while语句的语法结构如下:
do
语句;
while(表达式);
(三)for循环
for循环和while循环一样,是个很重要的循环结构,相比之下,do-while循环用的很少,for循环使用最多。for循环的语法结构如下:
for(表达式1,表达式2,表达式3)
语句;
我们把循环中的三个语句拆开来看:
表达式1:用于循环变量的初始化;
表达式2:用于循环条件的判断;
表达式3:用于循环变量的调整;
我们来分析一下for循环是如何执行的。首先对变量进行初始化,也就是给变量赋最初始的值;随后进入表达式2,也就是判断部分,如果满足条件则执行语句3,如果不满足则跳出循环。表达式3调整变量后,再继续进入表达式2,直到不满足条件跳出循环为止。
那while循环和for循环哪个更方便呢?我们来看一下二者的对比:
看得出来二者的区别,由于不同场景需要不同,这里便不再探讨二者方便性比较了。
(四)continue和break语句
在上面我们讲到,如果没有语句能让程序跳出循环,那么程序就会一直执行下去,违背了算法的有穷性。那么怎么样才能跳出循环呢?C语言中提供了continue和break两个关键字。
- break的作用是用于永久终止循环,只要break被执行,就会直接跳出循环,执行下面的语句。
- continue的作用是跳过本次循环中continue后面的代码。
1.while循环中的break和continue
break举例:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
break;
}
printf("%d ", i);
i = i + 1;
}
return 0;
}
前面1234打印时正常打印。当i等于5时,if语句的条件满足,执行break,结束循环。大家要注意,break只能终止其外的第一层循环,也就是说,如果while循环中嵌套一个while循环,我们设为循环一和循环二,那么循环二中的break只能终止循环二,而循环一继续运行,如果想让循环一终止,则需要另外一个break。
continue举例:
#include<stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
i = i + 1;
}
return 0;
}
我们来看执行结果:
代码永远没有执行结束,陷入了死循环,因为continue后的语句一直不执行,i一直等于5,继而一直满足continue的条件,陷入了死循环。
2.for循环中的break和continue
for循环中的break和while循环中的break类似,都是用来终止循环的,我们直接看代码:
#include<stdio.h>
int main()
{
int i = 1;
for(i=1;i<=10;i++)
{
if (i == 5)
{
break;
}
printf("%d ", i);
}
return 0;
}
但是for循环中的continue和while循环就不太一样了,我们还是先上代码再分析:
#include<stdio.h>
int main()
{
int i = 1;
for (i = 1;i <= 10;i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
return 0;
}
我们再执行一下看看,输出结果是“1 2 3 4 6 7 8 9 10”,为什么会出现这种情况呢?大家可以看到,continue后的语句只有打印语句,也就是说,当i=5时,只跳过了打印语句,其余的正常执行。当i++执行后i变成了6,便不再满足if语句的条件,直到循环自然终止。
3.do-while语句中的break和continue
do-while循环中的break和continue与while循环中的作用几乎一模一样。我们直接上代码,同学们自行体会一下:
#include<stdio.h>
int main()
{
int i = 1;
do
{
if (i == 5)
{
continue;//或者break
}
printf("%d ", i);
i = i + 1;
} while (i <= 10);
return 0;
}
(五)goto语句
goto语句是一个比较特殊的语句,上文提到,一个break只能跳出一个循环,如果想要跳出多层循环就需要多个break,非常繁琐。那么goto语句就是将程序跳转到某个地方继续执行。例如:
#include <stdio.h>
int main()
{
printf("hehe\n");
goto next;
printf("haha\n");
next:
printf("跳过了haha的打印\n");
return 0;
}
在这里就跳过了打印“haha”,直接继续执行了next部分。
二、练习
(一)while语句练习
//输⼊⼀个正的整数,逆序打印这个整数的每⼀位
//例如:
//输⼊:1234,输出:4 3 2 1
//输⼊:521,输出:1 2 5
- 想要得到最后一位,可以用取余(模)
- 想要得到倒数第二位,可以先整除,再取余
参考代码:
#include<stdio.h>
int main()
{
int n = 0;
scanf("%d ", &n);
while (n)
printf("%d \n", n % 10);
n = n / 10;
return 0;
}
(二)for语句练习
//计算1-100之间3的倍数之和
在这里我们提供两种思路:
- 依次找出3的倍数,然后相加
- 直接产生3的倍数。然后想加
//第一种
#include<stdio.h>
int main()
{
int a = 0;
int sum = 0;
for (a = 1;a < 100;a++)
{
if (a % 3 == 0)
sum += a;
}
printf("%d ", sum);
return 0;
}
//第二种
#include<stdio.h>
int main()
{
int a = 0;
int sum = 0;
for (a = 3;a < 100;a+=3)
{
sum += a;
}
printf("%d ", sum);
return 0;
}
(三)do-while练习
//输⼊⼀个正整数,计算这个整数是⼏位数?
//例如:
//输⼊:1234,输出:4
//输⼊:12,输出:2
代码参考:
#include<stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
int cnt = 0;
do
{
cnt++;
a = a / 10;
} while (a);
return 0;
}
好了,今天就先说到这里,我们下期再见!