C语言 分支与循环

本文详细介绍了C语言中的分支语句(if、switch)和循环执行语句(while、for、do while)。讲解了if语句的悬空else问题、switch中的default子句、以及各种循环语句的执行流程和break、continue的用法。强调了使用{}明确代码逻辑的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        前言:C语句分为以下五类:

                                                        1.表达式语句

                                                        2.函数调用语句

                                                        3.控制语句

                                                        4.复合语句

                                                        5.空语句

                本文之后所介绍的属于控制语句。


目录:

        一.分支语句(条件判断语句)

                       1.1:if语句

                       1.2:switch语句

        二.循环执行语句

                       2.1:while语句

                       2.2:for语句

                       2.3:do while语句

             


1.1 if语句

                  语法结构:

		//结构1
		if (表达式)
			语句;

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

		//多分支
		if (表达式1)
			语句1;
		else if (表达式2)
			语句2;
		else
			语句3;

默认每次if/else if/else只能输出一条语句,若需要输出多条语句,必须要使用大括号"{}"括起来 

//输出多条语句
	if (表达式1) {
		语句1;
		语句2;
	}
	else
		语句1;

 那语句应该如何执行呢?

            当表达式的结果为真时,语句执行           

在C语言中如何表示真假?

        0表示真,非0表示假  

接下来举个简单的例子:

        

	int age = 0;
	scanf("%d", &age);//从控制台输入岁数

	if (age < 18)
		printf("未成年\n");
	else if (age >= 18)
		printf("成年\n");

假如我们输出的是小于18的数,则会打印未成年三个字,反之,则会打出成年。

接下来讲述一些if语句中容易出现的问题

               1.1.1 悬空else

//以下的代码会怎样打印呢?
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("输出1\n");
		else
			printf("输出2\n");
	return 0;

上述的代码的答案是:什么都不会输出

因为else的匹配是有个原则的:else是和离它最近的if匹配的

                若想要正常输出,应修改为:

//修改后会打印出  输出2
	int a = 0;
	int b = 2;
	if (a == 1) {
		if (b == 2) {
			printf("输出1\n");
		}
	}
	else {
		printf("输出2\n");
	}

可见适当使用{}可以使代码逻辑更加清晰,所以一般建议无论输出1条或者以上一句都带上{}


1.2 switch语句(常用于多分支)

                

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

在swicth语句中,如果没有break没办法直接实现分支,所以一般搭配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;
	}

上述代码输入相应的数字,就能输出相应语句。

那么一定要使用break才行吗?

        是否使用break得根据情况来决定,若前面条件输出的语句相同,则可以在最后使用break

如:

	int day = 0;
	scanf("%d", day);
	switch (day)
	{
				case 1:
				case 2:
				case 3:
				case 4:
				case 5:
					printf("工作日\n");
					break;
				case 6:
				case 7:
					printf("周末\n");
					break;
	}

在上述代码中输入1~5后输出的语句相同,输入6~7后输出的语句相同。因为是你选择的case从上往下执行的,所以case中有语句却没break的话会继续往下执行,若在case3中添加个break,则1~3为一部分,4~5为一部分,6~7为一部分。

所以:break语句的实际效果是把语句列表划分为不同的分支部分

        1.2.1 default子句

                        如果表达的值与所有case标签的值不匹配怎么办,这时候default的作用就出来了

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

如果表达的值与case标签的值不匹配,则会执行default中的语句

一般即使switch语句中不加default也不会出现错误,但建议每个switch语句中都放一条default子句,default中也可以加break;


2.1 while语句

                        

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

while语句执行的流程:

                

 比如:

//在屏幕打印1-10数字
int i = 1;
	while (i <= 10)
	{
		printf("%d ", i);
		i = i + 1;
	}

               同样,break和continue也在while语句中有着相应作用

                        while中的break是用于永久终止循环的

                        while中的continue是用于终止本次循环,而直接跳转到while语句的判断部分,进行下一次的入口判断


2.2 for循环

              for循环可以说是三种循环中用得最多,泛用性最高的循环语句

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

表达式1:初始化部分,用于初始化循环变量的

表达式2:条件判断部分,用于判断循环时候终止

表达式3:调整部分,用于循环条件的调整

比如:

	//打印数字1-10
	for (int i = 1; i <= 10; i++)
	{
		printf("%d ", i);
	}

执行流程图为

for循环中的break和continue意义与while是一样的,所以不再赘述

PS:for的三个条件可以都可以省略,如for(;;),但不建议,容易导致问题。


2.3 do while语句

                语句结构:

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

执行流程图:

与while和for不通的是,while和for是先判断在执行。而do while是不管表达式真假,先执行一次语句再判断表达式的真假,若真则继续执行,假结束

如:

//打印数字1-10
int i = 1;
 do
 {
 printf("%d ", i);
        i=i+1;
 }while(i<=10);

break和continue与上述的意义相同


需要注意的是,上述五个语句中所执行的语句,若没{}则默认只执行一条,即使多条也不执行,会报错,所以建议不管一条还是多条,都建议用{}括起来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值