【C语言】分支与循环if,switch,while,for等语句

前言


C语言的语句可分为五类:

1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句

本篇我们主要探讨的是控制语句里的分支与循环。

控制语句又分为以下三类:

  1. 条件判断语句也叫分支语句if语句、switch语句;
  2. 循环语句do while语句、while语句、for语句;
  3. 转向语句break语句、goto语句、continue语句、return语句。

一、分支语句

所谓分支,就是选择。

1.if语句

if语句的语法结构

单if

if(表达式)
	语句;

if-else

if(表达式)
	语句1;
else
	语句2;

多分支

if(表达式1)
	语句1;
else if(表达式2)
	语句2;
else
	语句3;

如果表达式为真,则语句执行,为假则进入下一个分支。(0为假,非零为真)

这里的{ }是代码块,表示这个代码所属于前面的语句。

#include<stdio.h>
int main()
{
	int score = 0;
	scanf("%d", &score);
	if (score < 60)
	{
		printf("不及格\n");
	}
	else if (score >= 60 && score < 80)
	{
		printf("及格\n");
	}
	else if (score >= 80 && score < 90)
	{
		printf("优秀\n");
	}
	else
	{
		printf("特优\n");
	}
	return 0;
}

里面的语句只有一条的话可以不加{ },但不管语句是一条还是多条,建议都加上{ },这样不容易出错。

悬空else
看这段代码,会输出world吗?

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 20;
	if (a == 1)
		if (b == 100)
			printf("hello\n");
	else
		printf("world\n");
	return 0;
}

当然不会,什么也不会输出。因为else只会和离它最近的if匹配。
这种写作习惯不好,读起来也费劲。适当的使用{}可以使代码的逻辑更加清楚。提高可读性。

改正后

#include<stdio.h>
int main()
{
	int a = 0;
	int b = 20;
	if (a == 1)
	{
		if (b == 20)
		{
			printf("hello\n");
		}
	}
	else
	{
		printf("world\n");//走到这里输出world
	}
	return 0;
}

2.switch语句

switch语句常常用于多分支的情况。

用法
switch(整型表达式)
{
case 整形常量表达式:
   语句;
}

break
在switch语句中,我们没办法直接实现分支,搭配break使用才能实现真正的分支。
在执行case分支语句时,程序遇到break才会停止,否则会一直向后执行其它的case语句,达不到分支选择的效果。

default
可以在语句列表中增加一条default语句,当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
不过也可以不加,程序不做处理会继续向后执行。

比如输入数字来输出对应星期几

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	switch (day)
	{
	case 1:
		printf("Monday\n");
		break;
	case 2:
		printf("Tuesday\n");
		break;
	case 3:
		printf("Wednesday\n");
		break;
	case 4:
		printf("Thursday\n");
		break;
	case 5:
		printf("Friday\n");
		break;
	case 6:
		printf("Saturday\n");
		break;
	case 7:
		printf("Sunday\n");
		break;
	default:
		printf("error\n");
		break;
	}
	return 0;
}

并不是每条语句都需要break,按需求来写。

比如想要实现1-5输出weekday,6-7输出weekend

#include<stdio.h>
int main()
{
	int day = 0;
	scanf("%d", &day);
	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("error\n");
		break;
	}
	return 0;
}

break语句的实际效果是把语句列表划分为不同的分支部分,防止连续执行。

每一个switch语句中有且只有一条default语句,它可以出现在语句列表的任何位置,并非一定在最末尾的位置,只是习惯放到最后。

二、循环语句

对于if语句,如果()里面的表达式为真,语句则会执行一次,如果要执行多次,就需要用到循环语句

1.while循环

语法结构

while(表达式)
{
	循环语句;
}

使用while循环打印1~10

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

while中的break指令可以直接永久终止当前循环,跳出本层循环

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

结果输出1 2 3 4 5 6,在 i 等于7的时候触发break指令终止循环

while中的continue语句可以终止本次循环,后面代码不会再执行,直接跳转到while语句的判断部分进入下一次循环

下面这样写正确吗?

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

程序会发生死循环,因为 i 等于7时后面语句不会再执行,i 也不会+1,会一直判断,一直continue陷入死循环

应当这样写

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

区别: 在一层循环中一般有多次循环,break结束的是本层循环,而continue结束的是本次循环

2.for循环

语法结构

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

使用for循环打印1~10

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

对比while循环和for循环

在这里插入图片描述
for循环将三个必须条件集中起来,方便查找修改。for循环的风格更胜一筹,使用的频率也最高。

3.do…while循环

语法结构

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

与while循环不同的是,do…while循环是先执行一遍循环语句,再判断

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

其break和continue用法与while循环用法一样。

三、转向语句

break语句和continue语句上面已经探讨过,接下来就不再说明了。

1.return语句

语法结构

return 表达式;

return 语句的作用是从当前函数退出,并从该函数返回一个值。
主要用于函数中,最常见的就是主函数末尾return 0;

#include<stdio.h>
int main()
{
	return 0;
}

这是一个判断闰年的函数

#include<stdio.h>
int is_leap_year(int y)
{
	if((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0))
		return 1;
	else
		return 0;
}
int main()
{
	int ret = is_leap_year(2024);
	if (ret == 1)
		printf("闰年\n");
	else
		printf("不是闰年\n");
	return 0;
}

return语句只要执行,其所在函数便会终止。

大家可以在for循环中加入return试试看。

2.goto语句

break语句只能跳出一层循环
goto语句可以一次跳出两层或多层循环

for (...)
{
	for (...)
	{
		for (...)
		{
			if (表达式)
				goto error;
		}
	}
}
error:
	//处理特殊情况

goto语句也称为无条件转移语句
从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。
goto语句常用于终止程序的深度嵌套,比如跳出两层或多层循环。

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值