C语言:分支语句和循环语句

往期文章

  1. C语言:初识C语言

前言

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

在这里插入图片描述

1. 什么是语句

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

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

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

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

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

2.1 if语句

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

#include <stdio.h>

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

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


#include <stdio.h>

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

#include <stdio.h>

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

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

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

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

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

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

#include <stdio.h>
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 <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	   if (b == 2)
		   printf("hehe\n");
	else
		printf("haha\n");
	return 0;
}

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

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

#include <stdio.h>

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 <stdio.h>
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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>

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 <stdio.h>
int main()
{
	int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i = i + 1;
	}
	return 0;
}

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

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

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

#include <stdio.h>
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 <stdio.h>
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 <stdio.h>

int main()
{
	//变种1
	for (;;)
	{
		printf("hehe\n");
	}
	//变种2
	int 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 <stdio.h>
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)
// 处理错误情况

后记

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

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lxkeepcoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值