一篇文章教你分支语句

引言 

  在C语言里分支结构又称为选择结构,就像生活里常见的选择,比如我就今天中午选择去吃猪脚饭,还是螺蛳粉,或是多分支选择,我今天中午选择去吃猪脚饭,螺蛳粉,快餐饭,水饺。

  这就对应了我们在C语言里的两种最常见的分支语句分别是if和switch语句。

1.if语句

        1.1if语句的结构写法:

if(条件判断)//为真执行
{
    执行语句
}
else//当if后面的条件判断为假就会直接执行
{
    执行语句
}

        我们都知道在C语言里,非0为代表真,0代表假,当关系表达式为真时就会执行。

实例1:

#include <stdio.h>
int main()
{
	int n = 2;
	int m = 3;
	if (m > n)
		printf("%d\n", m);
	return 0;
}

        这里m>n编译器进行判断后结果为真,执行了if语句,打印3,若判断结果为假就会结束if语句,什么也不会打印。

例子2:

int main()
{
	int n = 2;
	int m = 3;
	if (m < n)
		printf("%d\n", m);
	else
		printf("%d\n", m);
	return 0;
}

        这个实例2就演示了,条件判断为假后执行else语句,当我们使用if语句时,一个if就可以完成我所期待的事,那else就可以省略。

        在if语句里,if和else总是与它最近的语句相匹配,如果一个if里需要多条执行语句,那就需要使用花括号(  {}  ),来框在一起。

实例3:

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d %d", &m, &n);
	if (m % n == 0)
	{
		m = m + n;
		printf("%d\n", m);
	}
	else
	{
		n = m + n;
		printf("%d\n", n);
	}
	return 0;
}

        如果在实例3里不加入花括号,那么实例3里均不会执行printf语句。

1.2if语句的嵌套

        if语句是可以层层叠加,以方便于我们进行更复杂的逻辑判断。

 这是第一种if语句嵌套方法。

int main()
{
	int noodle = 20;//螺蛳粉
	int snack = 10;//零食
	int rice = 25;//猪脚饭
	int ox = 18;//牛肉干
	int money = 0;
	scanf_s("%d", &money);//我现在有对少钱
	if (money > 25)
	{
		printf("我现在好饿想把50快都拿去吃好吃的\n");
		money = money - 20;
		if (money > 25)
		{
			money = money - rice;
			printf("我又吃了一份我超喜欢的猪脚饭!!!\n");
		}
		else
		{
			printf("我的钱好像不够吃饭了,那我再买一点小零食\n");
			money = money - snack;
			printf("我还有%d块钱\n", money);
		}
	}
	else
	{
		printf("我现在的钱好像不够!还是去买点零食吧");
	}
	return 0;
}

       这是第二种if语句嵌套方法

int main()
{
	int noodle = 20;//螺蛳粉
	int snack = 10;//零食
	int rice = 25;//猪脚饭
	int ox = 18;//牛肉干
	int money = 0;
	scanf_s("%d", &money);//我现在有对少钱
	if (money == 50)
	{
		printf("我现在好饿想把50快都拿去吃好吃的\n");
		money = money - noodle;
	}

	else if (money > 30)
	{
		printf("我现在好饿想把50快都拿去吃好吃的\n");
		money = money - rice;
	}
	else
	{
		printf("我现在的钱好像不够!还是去买点零食吧\n");
		money = money - ox;
	}
	printf("我还有%d块钱", money);
	ret

        在使用上我更推荐使用第二种嵌套方法,其优点:可读性高,更加简洁。

其逻辑可以理解为

1.3else悬空问题

        else悬空问题:是指else没有与任何一个if或者else if进行匹配。

int main()
{
	int a = 10;
	int b = 8;
	if (a < b)
		if (a > b)
			printf("a大于b\n");
	else
		printf("你猜会打印我还是上一个printf函数\n");
	return 0;
}

        判断一下这窜代码运行后会打印什么内容?

        事实上这窜代码的运行结果是空的,什么也不会打印,这就是else悬空问题。为什么会这样呢?if语句里的else总是与它最近的if相匹配。正确写法是这样。

int main()
{
	int a = 10;
	int b = 8;
	if (a < b)
	{
		if (a > b)
			printf("a大于b\n");
		else
			printf("你猜会打印我还是上一个printf函数\n");
	}
	return 0;
}

        这样就很明了,运行代码后a是大于b的第一个if就没有执行,所以不会进入嵌套的if语句,执行代码后,什么也不会打印。

2.switch语句

        switch语句与if语句类似,但是它可以进行更多的选择判断,这是它的结构。

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

        switch里case 对应的整形常量表达式,为switch()里的整形表达式,整形表达式的值对应case 的表达式,如果没有相匹配的case 就会执行default。

2.1switch里的case和break

        在switch语句,里我们必须在每个case与数字之间加上个整形。

        在switch语句里,如果我们加上break或者去除会产生什么样的效果?

#include <stdio.h>

int main()
{
	int input = 0;
	printf("随机输入1到3的数字,来选出自己等会去做什么?\n");
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		printf("我可以去吃零食了!\n");
		break;
	case 2:
		printf("我现在还不是娱乐的时候,乖乖去敲代码吧~\n");
		break;
	case 3:
		printf("我终于可与去休息了!\n");
		break;
	default:
		printf("我现在好像有些迷糊,是1到3的数字。\n");
		break;
	}
	return 0;
}

        如果在这里将所有break去除,在switch里将会执行input对应case以下的所有代码。

     这是为什么呢? 原因是 switch 语句也是分⽀效果的,只有在switch语句里使用break才能跳出switch,如果某一个case语句后面没有加上break,那执行完这条case语句后不会停止,跳出switch,还会接着执行下一条case语句,直到遇见break后才会停止,所以break在switch里是非常难重要的。但这并不代表每一条case语句后都需要跟上一个braek,这需要更具实际情况来进行选择。

 2.2switch里的default

        default在switch里用于处理,switch()里的整形表达式与每一个case后的整形常量不相匹配的情况,如果switch()里整形常量表达式的没有与之对应的case的整形常量,那就会执行default语句。

        这是执行上述代码后的输入4或其它常量的结果。

 2.3switch语句里case与default的顺序

        在switch语句里case与default的顺序并不是绝对的,而是可以随意组合的,default放在case里的任意位置,case不跟据它后面的常来进行排序也是可行的。

        但不过,为了满足正常的逻辑表达,才会按照正常逻辑来排序,的default通常是放在句末的位置。

int main()
{
	int input = 0;
	printf("随机输入1到3的数字,来选出自己等会去做什么?\n");
	scanf("%d", &input);
	switch (input)
	{
	case 1:
		printf("我可以去吃零食了!\n");
		break;
	case 3:
		printf("我现在还不是娱乐的时候,乖乖去敲代码吧~\n");
		break;
	default:
		printf("我现在好像有些迷糊,是输入1到3的数字。\n");
		break;
	case 2:
		printf("我终于可与去休息了!\n");
		break;
	}
	return 0;
}
     
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值