欢迎大家来跟我学习本期的分支语句和循环语句~
让我们一起来看看吧~
分支语句和循环语句
语句究竟是什么呢?
在我们所学的C语言中,把语句分为五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
接下来我们学习的分支语句和循环语句都属于控制语句
控制语句我们有9种
- 分支语句:if语句,switch语句
- 循环执行语句:while语句,for语句,do while语句
- 其他语句:break语句,goto语句,continue语句,return语句
其他语句我们暂时不讲,先来看看分支和循环的5种语句吧~
分支语句
if
if语句的语法结构
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
那么我们接下来直接上实战
//初始化年龄
int ages = 0;
//获取输入年龄
scanf("%d", &ages);
//判断
if (ages >= 18)
printf("%d成年了\n", ages);
else
printf("%d未成年\n", ages);
这里有一点我们需要注意的是当我们的语句不是一条,而是一个代码块时,需要用一对{}把要执行的代码块括起来,就像这样:
if(表达式)
{
语句列表1;
}
else
{
语句列表2;
}
当我们用到else语句时有一个点要稍稍注意一下
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("我爱学习");
else
printf("我非常热爱学习");
当我有一段这样的代码你是不是会判断第一个if的条件不满足,进而执行else的语句,但是事实证明这段程序什么都不会输出,这是因为else会遵循就近原则自动匹配距离它最近的if进行配对,这段代码本意是👇
int a = 0;
int b = 2;
if (a == 1)//可以尽量把常量放左边nb(1==a)可以规避错误
if (b == 2)
printf("我爱学习");
else
printf("我非常热爱学习");
这个例子告诉我们在平时的学习过程中一定要注意代码规范,养成一个良好的的习惯。
于是上面的代码我们可以改成👇
int a = 0;
int b = 2;
if (a == 1)
{
if (b == 2)
{
printf("我爱学习");
}
}
else
{
printf("我非常热爱学习");
}
switch
switch语句用于多分支情况
我要写一个程序:输入数字1~7,将对应的星期几输出,比如输入1,输出星期一,难道我要写if...else if...else if... ...... else...吗?
于是我们引入switch语句
switch语句格式如下:
switch(整型表达式)
{
语句项;
}
于是我们可以写出如下程序:
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
case 2:
printf("星期二\n");
case 3:
printf("星期三\n");
case 4:
printf("星期四\n");
case 5:
printf("星期五\n");
case 6:
printf("星期六\n");
case 7:
printf("星期天\n");
}
但是仔细观察或者调试我们会发现程序会将匹配项及其后的全部输出,这并不是真正意义上的分支,那怎末实现真正意义上的分支呢?
答:只要在语句项后面写上break,理解以下就是break负责跳出switch语句,所以只要在你想要跳出的位置加上break就好了
于是我的程序👇
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
default:
printf("选择错误\n");
break;
}
细心的小伙伴发现我在最后加上了default,这是为什么呢,我们考虑到实际应用,如果输入的数字不是1~7怎么办,于是default语句的作用就来了:当所有case都不匹配时执行default语句。最后switch语句是可以进行嵌套使用的,就向if的嵌套一样,这里小编就不给大家过多解释了。
循环语句
循环语句的实际应用你可以理解为现实生活中某件事我要重复做,而上一期《从零开始学c语言》用while循环简单介绍了循环结构从零开始学C语言-CSDN博客https://blog.csdn.net/m0_56200112/article/details/140136720?spm=1001.2014.3001.5501
在这我们也可以再说一下循环语句的结构
输入一个整数,并输出0到该数的和
int num1;
scanf("%d", &num1);
int sum = 0;
int i = 1;
while (num1 >= i)
{
sum = sum + i;
i++;
}
printf("%d\n", sum);
由上面我们已经了解了while语句,在一起来看一下while语句中的break和continue吧~~~
while
如果我要输出1~5的数字,那因该怎样写我的程序呢?
int i = 1;
while (i <= 10)
{
if (6 == i)
break;
printf("%d ", i);
i++;
}
咦~我们上边说break的作用是跳出switch语句呀,当然break也可以跳出循环啦。
那continue呢,把break换成continue我们看一下运行结果
程序运行以后,一直重复输出1,变成了死循环,于是我们得到continue用于终止本次循环,也就是本次循环中continue后边的代码不会执行,而是直接跳转到while语句的判断部分,进行下一次循环的入口。
for
for循环的语法格式:
-
for(表达式1,表达式2,表达式3) 循环语句;
其中,
表达式1为初始化部分,用于初始化变量
表达式2为条件判断部分,用于判断循环时终止
表达式3为调整部分,用于循环条件的调整
然后接下来实战一下吧!
题目:使用for循环,在屏幕上打印1-10的数字
int i = 0;
for ( i = 1; i < 11; i++)
{
printf("%d ", i);
}
这样就可以啦,看一下运行结果
拓展一下,尝试在for循环中加入break,和continue呢?
int i = 0;
for ( i = 1; i <=10; i++)
{
if (i == 5)
{
break;
}
printf("%d ", i);
}
break直接跳出循环(跳出所在循环体的循环)
int i = 0;
for ( i = 1; i <=10; i++)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
}
在for循环中,continue也跳过本次循环后面的代码,但是与while循环不同的是,continue在while循环中跳到其判断部分,在for循环中跳到调整部分
我们思考一下,在刚刚的题目一中for循环的三个表达式全部正常填写,那省略会发生什么呢?
for (;;)
{
printf("hi~");
}
这个时候我们发现陷入死循环,这是因为for循环的判断部分省略意味着判断会恒成立
int i = 0;
for ( i = 0; i <10; i++)
{
printf("hi~\n");
}
现在我有此程序,会在屏幕上打印10次hi~
若是修改成如下所示程序→
int i = 0;
for (; i < 10; i++)
{
printf("hi~\n");
}
结果也是会打印10hi~
明显,在这种情况下,两种程序在输出结果上并没有差别
我们换成双层循环
int i = 0;
int j = 0;
for ( i = 0; i < 3; i++)
{
for ( j = 0; j < 3; j++)
{
printf("helllo~\n");
}
}
这个结果打印9次hello~
同上我们修改程序,省略两次循环表达式1的部分,看会发生什么
int i = 0;
int j = 0;
for (; i < 3; i++)
{
for (; j < 3; j++)
{
printf("helllo~\n");
}
}
咦~~~
怎末回事,双侧循环反而只打印了一层循环的结果......
由此可见,省略的代价是巨大的,我希望在学习C语言的过程中用到for循环尽量不要省略
下面再给大家说一个需要注意的小点
for (int i = 0; i < 10; i++)
printf("hi~\n");
像上面这种把初始化条件放到循环里边的,要C99标准支持,而且C++是支持这种语法的,可能在某些编程环境中不支持,大家不要见怪不怪哦~
最后一点,大家知道这个代码会输出什么吗?
int i = 0;
int k = 0;
for(i=0,k=0;k=0;k++)
{
k++;
}
是一次也不循环哦,因为本该在for条件判断语句中判断的部分,变成了赋值语句,0为假,不进入循环的!
关于for循环我们就说到这里了
do while
do while的语法格式
do
{
循环语句;
} while (表达式);
do while的语句和以上两种略有不同,他是至少循环一次的,使用场景比较有限
看下面这样一段程序:
int i = 1;
do
{
printf("%d ", i);
} while (i<=10);
结果是会陷入死循环,因为根据do while的特点代码至少执行一次,进去就执行,而且在下一次进入的时候i始终是1,永远符合判断条件,所以死循环
我们看第二个程序:
int i = 1;
do
{
if (i==5)
{
break;
}
printf("%d", i);
i++;
} while (i<=10);
这段程序的运行结果是1234
int i = 1;
do
{
i++;
if (5==i)
{
continue;
}
printf("%d ", i);
} while (i<=10);
这段程序的运行结果是2 3 4 6 7 8 9 10 11
基于第三段代码,有如下的程序
int i = 1;
do
{
if (i == 5)
{
continue;
}
printf("%d ", i);
i++;
} while (i<=10);
这个结果是死循环哦~~~
请大家对比一下这几段代码,能发现什么呢?(不懂的请留言哦~)
好的,do while 就先学到这里了......
其他语句
最后还是把goto补充上了,只说这一个哦~~~
goto
C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
很多时候goto语句是没有必要的,但是某些场合下goto语句还是用得着的,例如一次跳出两层或多层循环。因为多层循环这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。
again:
printf("hello world\n");
printf("welcome\n");
goto again;
goto语句不能跨函数使用
下面是本人在学习过程中,学到的使用goto语句的一个例子,提供给大家参考:
关机程序
1.电脑运行起来后,1分钟内关机
2.如果输入:我是猪,就取消关机
char input[20] = { 0 };
system("shutdown -s -t 60");
again:
printf("请注意,你的电脑在60秒内关机,如果输入:我是猪,就取消关机");
scanf("%s", &input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
这段程序 也可以用循环哦~~~大家可以尝试自己改写一下
本期的内容就到这里了啦......