C语言:分支语句和循环语句
创始人
2024-05-12 05:12:52
0

往期文章

  1. C语言:初识C语言

目录

  • 往期文章
  • 前言
  • 1. 什么是语句
  • 2. 分支语句(选择结构)
    • 2.1 if语句
    • 2.2 switch语句
  • 3. 循环语句
    • 3.1 while循环
    • 3.2 for循环
    • 3.3 do while 循环
    • 3.4 goto语句
  • 后记

前言

趁热打铁啊。写完该系列第一篇博客我就来劲了,迫不及待地开始第二篇。我自认为我第一篇文章写地不错,内容详细,配图认真,大家感兴趣可以点击链接上面往期文章支持一下。也欢迎大家批评指正。接下来我们开启第二篇文章,主要来介绍分支语句很循环语句。欢迎大家多多支持。
在这里插入图片描述

在这里插入图片描述

1. 什么是语句

C语言中由一个分号 ; 隔开的就是一条语句。
所以,我们这个专栏的名字是:以分号结尾的诗。
如果只有一个分号是空语句。

printf("nihao");
1+2;
;

2. 分支语句(选择结构)

我们先来回顾一下第一篇文章中的内容:
在这里插入图片描述

这就是需要选择结构的情况。
那么,我们如何实现选择语句呢?我们有if语句和switch语句。

2.1 if语句

在这里插入图片描述
表达式结果为真,则条件成立,反之则代表着条件不成立。
我们来看一个例子:

#include int main()
{int age = 0;scanf("%d", &age);if (age<18){printf("未成年\n");}return 0;
}

在这里插入图片描述
大家注意,如果if语句后不加{},那么其后只有一条语句可以被if作用,如果if后要被if作用多条语句,一定要加{}。举一个例子。


#include int main()
{int age = 0;scanf("%d", &age);if (age<18)printf("未成年\n");printf("不可以抽烟喝酒\n");printf("不可以结婚\n");return 0;
}#include int main()
{int age = 0;scanf("%d", &age);if (age < 18){printf("未成年\n");printf("不可以抽烟喝酒\n");printf("不可以结婚\n");}return 0;
}

在这里插入图片描述
大家明白{}的作用啦嘛。{}里面才是一个代码块哦。所以为了防止出错,我们建议全部跟上{}。
所以多条语句的正确书写格式为:

#include 
int main()
{if (表达式){语句列表1;}else{语句列表2;}return 0;
}

if还有一个好搭档——else。else的作用不容小觑,我们一起来看看。

#include 
int main()
{int age = 0;scanf("%d", &age);if (age<18){printf("未成年\n");}else{printf("成年\n");}
}

在这里插入图片描述
else后{}的作用同if一样。
但是有些时候,一对if、else难以解决问题,此时,我们就需要多分支语句啦。也就是要用到else if。

#include 
int main()
{int age = 0;scanf("%d", &age);if (age < 18){printf("少年\n");}else if (age >= 18 && age < 30){printf("青年\n");}else if (age >= 30 && age < 50){printf("中年\n");}
}

在这里插入图片描述

接下来,我们研究一个问题,这段代码会输出什么?

#include 
int main()
{int a = 0;int b = 2;if (a == 1)if (b == 2)printf("hehe\n");elseprintf("haha\n");return 0;
}

是呵呵呢还是哈哈呢?见证一下:
在这里插入图片描述
输出的是空空哦。
惊不惊喜?意不意外?为什么是这样呢?
因为else和其上面最近的if匹配

在这里插入图片描述
我们将格式调整一下就可以看地更明显:
在这里插入图片描述
这也告诉我们,良好的代码风格很重要,会给人清晰明了的舒服感。所以,大家写代码的时候,要注意代码风格哦。
还有一个小细节,也值得我们注意,我们看下面这样一个例子,如果我们想要写一个代码,希望当b=2的时候,输出hehe,但是由于我的马虎,只写了一个等于号,我们知道,==在c语言中,一个等于号是赋值,两个等于号才是相等。==此时程序是这样的:

#include int main()
{int b = 0;if (b = 2)printf("hehe\n");return 0;
}

这个程序最终会输出什么呢?
在这里插入图片描述

我们的程序写错了,与我们的本义是不符合的。但是屏幕上却输出了hehe。这是因为:
在这里插入图片描述
所以,一个赋值表达式是真,也就是一个非0数,所以可以执行。那么,面对这样不易察觉的错误,我们有没有什么好的办法避免呢?我们将代码换一种写法来看看:
在这里插入图片描述
我们将2和b换了一下位置,我们发现编译器报错了,我们就很容易察觉到,这里少写了一个等于号。所以这提示我们,if括号里判断变量是否等于一个数字这种情况,我们把数字写在前面,这样有助于我们检查错误。这也同样提示了我们,代码风格的重要性。

2.2 switch语句

switch语句也是一种分支语句。 常常用于多分支的情况。
我们来看这样一个例子:
在这里插入图片描述
如果我们用if、else语句,将会非常的麻烦,对于这种多分支情况,switch语句会有条理方便很多。我们来看一下switch语句的应用方法:

switch(整型表达式)
{
语句项;
}

语句项是:

//是一些case语句:
//如下:
case 整形常量表达式:
语句;

case语句搭配break来使用,case进入,break跳出。
于是上面星期的代码我们可以写成这个样子:

#include 
int main()
{int day = 6;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;}return 0;
}

在这里插入图片描述
注意,switch括号内放地是整型表达式哦。如果我们将day设置成float,代码就无法运行了。case后面必须要跟整型常量表达式。字符的也是整型常量,因为字符型对应的ASSIC码是整型。
在这里插入图片描述
我们说case和break搭配,但是是每一条case后,都要加break吗?非也。
如果我们改变一下需求:
在这里插入图片描述
我们的代码就可以改为这样来实现:

#include int main()
{int day = 6;switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;}return 0;
}

在这里插入图片描述
所以,我们知道,并不是case后一定跟break,而是根据需要添加break。
但是,我们再想一下,如果,我们输入的数字超出范围了怎么办?比如,我们让day=9。

#include int main()
{int day = 9;switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;}return 0;
}

在这里插入图片描述
这下啥也没输出。所有语句都被跳过了。有的时候,我们不希望发生这样的错误,所以我们就需要一点提示,于是default语句就对我们很重要啦。

在这里插入图片描述

#include int main()
{int day = 9;switch (day){case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;case 6:case 7:printf("weekend\n");break;default:printf("您输入地信息有误\n");}return 0;
}

在这里插入图片描述
所以,为了成为一名严谨的程序员,在需要的时候要加上default语句哦。
还有一点值得注意的是,switch内部的语句并没有严格的顺序,所以代码变成这样也是可以的哦:

#include int main()
{int day = 9;switch (day){default:printf("您输入地信息有误\n");case 6:case 7:printf("weekend\n");break;return 0;case 1:case 2:case 3:case 4:case 5:printf("weekday\n");break;}
}

有时候要卡死,有时候没有必要卡太死哦。
在这里插入图片描述

3. 循环语句

在这里插入图片描述
关于循环语句,我们之前在第一篇文章里以开端为例,已经比较详细地介绍啦,大家可以翻看一下第一篇博客哦。

3.1 while循环

//while 语法结构
while(表达式)
循环语句;

在这里插入图片描述

我们来看一个while循环的简单实例:

#include 
int main()
{int i = 1;while (i <= 10){printf("%d ", i);i = i + 1;}return 0;
}

在这里插入图片描述
同样,在while循环中我们也引入了break。
在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。

#include 
int main()
{int i = 1;while (i <= 10){if (i == 5)break;printf("%d ", i);i = i + 1;}return 0;
}

在这里插入图片描述
我们如果将代码换成如下,结果又是什么呢?

#include 
int main()
{int i = 1;while (i <= 10){i = i + 1;if (i == 5)continue;printf("%d ", i);}return 0;
}

在这里插入图片描述
continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行,而是直接跳转到while语句的判断部分。进行下一次循环的入口判断。

综上,我们知道,==break是中止循环,进入下一条语句,而continue是结束本次循环进入下一次循环。==这个非常重要,大家一定要注意它们的区别。对于新手小白,可能要花一段时间来弄明白这二者之间的区别,对于老手,也要注意它们的区别,不要马虎犯错。

3.2 for循环

for(表达式1;表达式2;表达式3)
循环语句;

表达式1为初始化部分,用于初始化循环变量的。 表达式2为条件判断部分,用于判断循环时候终止。 表达式3为调整部分,用于循环条件的调整。
在这里插入图片描述
在这里插入图片描述

#include 
int main()
{int i = 0;//for(i=1/*初始化*/; i<=10/*判断部分*/; i++/*调整部分*/)for (i = 1; i <= 10; i++){printf("%d ", i);}return 0;
}

在这里插入图片描述
我们对比一下while循环和for循环:
在这里插入图片描述
可以发现在while循环中依然存在循环的三个必须条件,但是由于风格的问题使得三个部分很可能偏离较远,这样查找修改就不够集中和方便。所以,for循环的风格更胜一筹。 for循环使用的频率也最高。

break和continue在for循环中区别和while中相同。

注意两点:
在这里插入图片描述
同时,for循环的三个条件是可以有缺失的。也可以有如下变种。

#include int main()
{//变种1for (;;){printf("hehe\n");}//变种2int x, y;for (x = 0, y = 0; x<2 && y<5; ++x, y++){printf("hehe\n");}return 0;
}

像变种1这样的写法,将无限循环,我们不建议这么做。

3.3 do while 循环

do
循环语句;
while(表达式);

在这里插入图片描述
do循环上来不做任何判断,所以循环至少执行一次。
来看一个do while的循环的例子:

#include 
int main()
{int i = 0;do{i++;printf("%d\n", i);} while (i<10);return 0;
}

在这里插入图片描述
同理,break和continue的语法在do while中也是一样的。

3.4 goto语句

C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出两层或多层循环。这种情况使用break是达不到目的的。它只能从最内层循环退出到上一层的循环。

适用于下面这种情况:

for(...)
for(...)
{
for(...)
{
if(disaster)
goto error;
}
}
…
error:
if(disaster)
// 处理错误情况

后记

好的,这篇博文就介绍到这里啦。希望对大家有所帮助。我将尽力更新,希望我可以坚持下去。
在这里插入图片描述

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
ASM贪吃蛇游戏-解决错误的问... 要解决ASM贪吃蛇游戏中的错误问题,你可以按照以下步骤进行:首先,确定错误的具体表现和问题所在。在贪...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...