C语言详解系列——分支语句详解if、switch


在之前的分享中,我们了解到了c语言是结构化的程序设计语言。分为顺序结构,选择结构,循环结构三大类。今天我将与大家详细分享选择结构中 if switch的用法。

什么是语句

我们说详解分支语句,首先我们需要知道什么是语句,其实用分号隔开的就是一个语句。在c语言中语句可以大致分为五类:

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

我们今天所讲的是控制语句,控制语句主要用来控制程序的执行流程,实现程序的各种结构方式。
例如:

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

if语句

if语句的语法结构到底是怎么样的呢?在if语句中分为双分支、多分支。语法结构如下

int main()
{
	if (表达式)
		语句;

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

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

}

如果表达式为真就执行语句,那么在C语言中如何表示真假呢?C语言规定了非0就为真,0就为假。注意if else if else默认只能控制一个语句。

#include<stdio.h>
int main()
{

	int a = 1;

	if (a == 1)
		printf("hehe\n");
	else
		printf("haha\n");
	    printf("momo\n");


	return 0;
}

例如上面这个代码最后输出的结果是hehe和momo同时输出。我们的思路其实是当a = 1时我们输出hehe其他时候输出haha和momo,那么该如何实现呢?我们就需要让else同时控制两个语句,执行多条语句。我们使用{}将语句括起来变成一个代码块,就可以实现。

#include<stdio.h>
int main()
{

	int a = 1;

	if (a == 1)
		printf("hehe\n");
	else
	{
		printf("haha\n");
	    printf("momo\n");
    }


	return 0;
}

悬空else

在分支语句中还有很多小的细节值得我们注意例如悬空else

#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;
}

上面这个代码的输出结果是什么呢?是不是有很多小伙伴觉得输出的结果是haha。其实不是,上面这个代码什么也没有输出。出现错误判断的关键就是对else的判断不准确,else是与第一个if对应还是与第二个if对应呢?这种情况我们就称为悬空else。直接上结论,else与他距离最近的if相匹配。所以上面的代码可以写为

#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;
}

不知道大家有没有感觉到第二次的代码比第一次的代码,逻辑更加清晰,更具观赏性。这里我们不得不提到代码书写风格的重要性。好的书写形式可以更好的帮助我们理解代码
例如:

int main()
{
	if (condition)
	{
		return x;
	}
	return y;

}
int main()
{
	if (condition)
	{
		return x;
	}
	else
	{
		return y;
	}

}

上面两个代码的逻辑是一样的,但是,是不是代码2的逻辑更加清晰。

 int main()
{
	int num = 1;
	if (num == 3)
	{
		printf("ok\n");
	}


	return 0;
}
int main()
{
	int num = 1;
	if (3 == num)
	{
		printf("ok\n");
	}

	return 0;
}

上述代码中的区别就在于if语句中的表达式不一样,虽然表达的意思相同但是代码2中的写法更加不容易出错。因为如果写错成if(3 = num)就会报错因为3是常量不能改变常量的值,而代码1中的表达式写错就不会报错。这些小细节就可以体现我们写代码的level。

switch语句

switch语句也是一种分支语句,常常用于多分支的情况。例如:判断今天是星期几,输入1,输出星期一,输入2,输出星期二,以此类推到输出星期日。我们可以用if else if else,但这样写起来太复杂了,这个时候我们就需要使用switch了。swtich语法结构

swtich(整形表达式)
{
语句项:
}

语句项是什么呢?

case 整形常量表达式:
语句;

例如:

int main()
{
	int day = 0;
	printf("输入今天的天数\n");
	scanf("%d", &day);

	switch (day)
	{

	case 1:printf("星期1");
	case 2:printf("星期2");
	case 3:printf("星期3");
	case 4:printf("星期4");
	case 5:printf("星期5");
	case 6:printf("星期6");
	case 7:printf("星期7");

	}

	return 0;
}

我们发现上面的代码并没有实现我们想要的分支逻辑,因为当我们输入1时,输出的结果为星期1到7,这是因为我们没有设置分支的出口break。

int main()
{
	int day = 0;
	printf("输入今天的天数\n");
	scanf("%d", &day);

	switch (day)
	{

	case 1:printf("星期1");
	    break;
	case 2:printf("星期2");
		break;
	case 3:printf("星期3");
		break;
	case 4:printf("星期4");
		break;
	case 5:printf("星期5");
		break;
	case 6:printf("星期6");
		break;
	case 7:printf("星期7");
		break;

	}

	return 0;
}

所以我们就了解到了,在switch语句中case决定分支的入口,break决定分支的出口。还有值得我们注意的是switch语句中必须使用整形表达式,浮点型不行会报错,字符型也可以在switch中使用,因为字符在底层存储当中是以阿斯克码值的形式存储的。

break的使用

并不是每一个case语句后面都需要加break语句,可以根据需求使用break控制分支的出口。例如:

int main()
{
	int day = 0;
	printf("输入今天的天数\n");
	scanf("%d", &day);

	switch (day)
	{

	case 1:	
	case 2:	
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
		break;

	}

	return 0;
}

这样我们就使用break语句把语句列表划分为不同的分支部分。在提一下代码编写的风格,最好在最后一个case后面加上一条break语句,这样方便下一次编写。

default 的使用

如果表达式的值与所有的case的标签值都不匹配,我们可以使用default来提示用户,default可以写在任何位置,并且一个switch语句只能有一个default子句。

注:最后在每个switch语句中都放一个default子句,并且可以在后面加上break

例如:

int main()
{
	int day = 0;
	printf("输入今天的天数\n");
	scanf("%d", &day);

	switch (day)
	{

	case 1:	
	case 2:	
	case 3:
	case 4:
	case 5:
		printf("工作日");
		break;
	case 6:
	case 7:
		printf("休息日");
		break;
    default:
        printf("输入错误");
        break;

	}

	return 0;
}

这样当我们输入大于7的数字时就会给我们提示输入错误了。

#include <stdio.h>
int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;
	case 2:
		n++;
	case 3:
		switch (n)
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2:
			m++;
			n++;
			break;
		}
	case 4:
		m++;
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);
	return 0;
}

最后给大家留下一道练习题,你知道最后结果是什么吗?答案是m = 5,n =3.你理解了嘛。

好了这就是我与大家分享的分支结构,如果写的不好希望大家提出建议,有错误也请大家指出,我希望可以和大家一起学习一起分享一起进步。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

悲伤猪小猪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值