分支语句

如果我们的代码中出现根据情况不同,选择不同的执行方式,或想要不同的结果,那么需要分支语句。而分支语句又分为很多种,但都不难理解,接下来我们逐一介绍

if语句

代码格式

单分支

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

多分支

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

在 以上 if 语句中

如果表达式1为真则执行语句1 ,若表达式2为真,则执行语句2,若均为假,则执行语句3.

让我们举个例子

#include<stdio.h>
int main()
{
	int a = 5;
	if (a < 0)
	{
		printf("a比0小\n");
	}
	else if (a == 0)
	{
		printf("a的值为0\n");
	}
	else
	{
		printf("a比0大\n");
	}
	return 0;
} //打印 a比0大

从以上代码可见  a不满足前两条表达式,所以不执行前两个printf语句,选择执行第三个。

易犯错误

逻辑错误

#include<stdio.h>
int main()
{
	int a = 10;
	if (1 < a < 5)
		printf("1");
	else
		printf("2");
	return 0;
}   //打印结果为1

我们来看上面的代码

a的值为10  ,比1要大,但比5小,本该是不满足表达式 并打印2,但为什么却打印了1呢?

 因为这是一个错误的代码,所以会得到一个错误的结果。

我们来看第一个表达式

if ( 1 < a < 5 )

虽然看上去没什么问题,但是其中隐藏一个坑

我们都知道在c语言中 :0为假,非0为真。在这段表达式执行的时候

会先判断 1 < a 是否为真 ,为真则为1,所以 1 < a 就变成了 1

代码继续执行 1 < 5,为真。 那么会判定为该表达式为真,该 if 分支条件满足,执行表达式1

最后打印 1 

 正确的写法应该是以下写法

#include<stdio.h>
int main()
{
	int a = 10;
	if (1 < a && a < 5)   //更改表达式写法
		printf("1");      //判断是否同时满足两个条件
	else
		printf("2");
	return 0;
}   //打印结果为2

有关大括号

当 if 语句后面只有一条语句时可以不加大括号

但如果有两条以上语句时必须加上大括号,否则会报错

#include<stdio.h>

int main()
{
	int a = 0;
	if (a < 0)
		printf("1");  //单条语句不需要大括号
	if (a >= 0)
	{
		printf("2");  //多条语句必须加大括号
		printf("3");
	}
	return 0;
}

悬空else

我们先来看看以下代码

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

以上代码会输出什么?

错误的解法:因为 a = 0,不满足第一个if表达式,所以跳过后面的代码,执行else,打印2

 而实际上,却是什么都不会打印

else 并不是和谁对齐就和谁一组,而是和最近的if为一组,所以实际的执行顺序为

因为不满足 a==1,所以后面的语句不执行,因为下面的 if 和 else为一组,所以直接跳过,什么都不打印。让我们加上大括号,让代码变得更直观

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

如果真的想要让第一个if和 else为一组 ,方法也很简单,用大括号括起来就好了

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

 = 和 ==

废话不多说,直接上代码

#include<stdio.h>
int main()
{
	int a = 0;
	if (a = 1)
		printf("1");
	return 0;
}    //打印1

a的值是0,不是1,理论上应该是什么都不打印,但为什么偏偏打了个1呢?

答案很简单 ,只需要把 a = 1改成 a == 1 即可

因为 == 才是判断是否相等, = 是赋值,即把1赋给了a,导致表达式变成了

#include<stdio.h>
int main()
{
	int a = 0;
	if (1)    // a = 1,1为真
		printf("1");
	return 0;
}    //打印1

1为真,表达式为真,故执行 printf

如何防止自己犯这种错误呢? 

很简单 只需要改一下习惯,当我们需要执行判断语句的时候

我们不再使用 a == 0,改为使用 0 == a,把表达式反过来。

这样即便我们漏写了一个 = ,也不会因为未被发现导致代码产生错误的结果。

我们直接将逻辑错误变成语法错误,编译器直接报错, 0 = a 编译器跑不过去

这样我们就能直接找到错误所在,而不会漏掉产生bug。

switch语句

switch语句常用与多分支  

例如,输入一个1-7的数字,输出:星期一 ~ 星期天

如果使用if语句是十分麻烦的,这个时候switch就显得十分简洁方便

switch的使用格式

include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (整形变量表达式)   //当变量表达式所表达的量与其中
	{                    //一个case语句中的常量相符时
	case 常量1:          //从相符的case开始执行
		语句1;  
		break;       //break表示跳出switch语句,不再向下执行
	case 常量2:
		语句2;
		break;
	case 常量3:
		语句3;
		break;
	default:         //若均不满足,则执行default
		语句4;
		break;
	}
	return 0;
}

我们来试试这个代码

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a)  
	{
	case 1:
		printf("星期一");
	case 2:
		printf("星期二");
	case 3:
		printf("星期三");
	case 4:
		printf("星期四");
	case 5:
		printf("星期五");
	case 6:
		printf("星期六");
	case 7:
		printf("星期天");
	default:
		printf("输入错误");
	}
	return 0;
}

当我们输入4会发生什么?打印星期四么?不,会打印

星期四星期五星期六星期天输入错误

 为什么呢?

因为switch不像if那样只执行满足条件的表达式,而是从相符的常量开始一直向后执行,case只是个起点,是一个入口,并不是选项。当a=4,那代码将会从case 4开始 ,一直执行到最后,

所以,我们需要break

break是跳出当前循环语句或switch语句,不再向后执行。所以我们的代码应该写成

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
	case 1:
		printf("星期一");
		break;
	case 2:
		printf("星期二");
		break;
	case 3:
		printf("星期三");
		break;
	case 4:
		printf("星期四");
		break;
	case 5:
		printf("星期五");
		break;
	case 6:
		printf("星期六");
		break;
	case 7:
		printf("星期天");
		break;
	default:
		printf("输入错误");
		break;
	}
	return 0;
}

这样就不会继续向后执行了

但 并不是说不加break就是错的,这是根据代码需求来决定,有时需要向后执行就不加break。 

比如我们希望区分工作日和假日,就可以这样写

#include<stdio.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	switch (a)
	{
	case 1:
	case 2:
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
		break;
	default:
		printf("输入错误");
		break;
	}
	return 0;
}

switch可以嵌套使用

#include<stdio.h>
int main()
{
	int a = 3;
	int b = 2;
		switch (a)
		{

		case 1:
			printf("1");
			break;
		case 2:
			printf("2");
			break;
		case 3:
			switch(b)    //switch可嵌套使用
			{
			case 1:
				printf("1");
				break;
			case 2:
				printf("2");
				break;
			case 3:
				printf("3");
				break;
			default:
				printf("4");
				break;
			}
			break;
		case 4:
			printf("4");
			break;
		default :
			printf("5");
			break;
		}
	return 0;
}   //打印 2 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值