首页 > 其他分享 >if、switch语句构成的选择结构详解

if、switch语句构成的选择结构详解

时间:2024-03-22 22:30:01浏览次数:23  
标签:语句 case int else switch 详解 printf

前言:C语言是结构化的程序设计语言,这里的结构指的是顺序结构、选择结构、循环结构,C语言是能够实现这三种结构的,其实我们如果仔细分析,我们日常所见的事情都可以拆分为这三种结构或者这三种结构的组合,下文将讲述C语言中选择结构相关语句语法

一、if语句

if语句分为单if语句if else语句if elseif else语句

1.单if语句

单if语句语法如下:

若表达式为真(非零)那么执行语句,若为假(零)那么不执行语句。

例子:

#include <stdio.h>
//输入一个值判断是否为奇数
int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 2 == 1)//==、!= 为判断操作符,符合逻辑即表达式值为1,反之为零
	{
		//若 num % 2 == 1 ,则执行下方语句
		printf("%d 是奇数\n", num);
	}
	return 0;
}

运行结果:

2.if-else语句

        如果⼀个数不是奇数,那就是偶数了,如果任意⼀个整数,我们要清楚的判断是奇数还是偶数怎么表示呢?这就需要if else语句了。

if else语句语法如下:

若表达式为真则执行语句1,若语句为假则执行语句2

例子:

#include<stdio.h>

int main()
{
	int num = 0;
	scanf("%d", &num);
	if (num % 2 == 1)
		printf("%d 是奇数\n", num);
	else//num % 2 != 1 那么num则为偶数
		printf("%d 是偶数\n", num);
	return 0;
}

运行结果:

很显然,if else语句适合非此即彼的条件执行。

3.if-else if-else语句

当要对于多个条件进行判断时,如一个人一生个个年龄阶段的称谓。

if-else if-else语句语法如下:

表达式1为真则执行语句1,若为假则判断表达式2,若表达式2为真则执行语句2,……;若else语句之前所有表达式均为假,则执行语句n

例子:

#include <stdio.h>
int main()
{
	int age = 0;
	scanf("%d", &age);
	if (age < 18)
		printf("少年\n");

	else if (age <= 44)
		printf("⻘年\n");

	else if (age <= 59)
		printf("中⽼年\n");

	else if (age <= 89)
		printf("⽼年\n");

	else
		printf("⽼寿星\n");

	return 0;
}

运行结果:

4.补充说明

      if语句是可以进行嵌套使用的,但要注意符合逻辑,默认在 if 和 else 语句中都只控制⼀条语句,如果想要控制多条语句,加上花括号即可,例如:

发现无论if后表达式是否为真,都会执行最后一个printf库函数,这就说明最后一个printf库函数不归此if控制,加上花括号试试:

这样此if就可以控制这最后一个printf库函数了,使得我们想要的逻辑成立。

5.if else语句使用误区(悬空 else 的问题)

如果有多个 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;
}

此程序是没有输出结果的,因为其真实逻辑如下:

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

解释:这就是悬空 else 的问题,如果有多个 if 和 else ,可以记住这样一条规则, else 总是跟最接近的 if 匹配。上面的反例代码排版,让 else 和第一个 if 语句对齐,让我们以为 else 是和第一个if匹配的,当 if语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第二个 if进行匹配的,这样后边的 if-else 语句是嵌套在第一个 if 语句中的,如果第一个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印

ps.因为C语言是对书写方式比较自由的语言,只要不语法错误,怎么写随意,但作为一个合格的程序员,还是应该让自己的代码书写规范易读,合乎逻辑。

二、switch语句

        除了 if 语句外,C语言还提供了 switch 语句来实现分支结构。switch 语句是⼀种特殊形式的 if-else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式

1.switch语句语法

根据表达式 expression 不同的值,执行相应的 case 分支。如果找不到对应的值,就执行 default 分支。(注:1.switch 后的 expression 必须是整型表达式  2.case 后的值,必须是整形常量表达式)。

2.程序例子详解switch语句

#include <stdio.h>
int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0\n");
		break;
	case 1:
		printf("余数是1\n");
		break;
	case 2:
		printf("余数是2\n");
		break;
	}
	return 0;
}

通过观察,我们知道:、

1.case 后边加的是冒号“:”而非分号“;”。

2.case和后边的数字之间必须有空格

3.每⼀个 case 语句中的代码执行完成后,都加上了break。

case和后边的数字之间必须有空格这是书写格式没有什么特别的,那么这个break有什么意义呢?

那么去掉break看看程序是如何运行的,是否还能得到我们想要的效果:


#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	switch (n % 3)
	{
	case 0:
		printf("整除,余数为0\n");
	case 1:
		printf("余数是1\n");
	case 2:
		printf("余数是2\n");
	}
	return 0;
}

运行结果:

我们发现,每一个case语句中的代码都被执行了,不再是我们想要的那种效果,那么这就提醒我们,每⼀个 case 语句中的代码执行完成后,需要加上 break ,才能跳出这个switch语句,否则就会继续向下执行,所以在 switch 语句中 break 语句是非常重要的,能实现真正的分支效果。当然, break 也不是每个 case 语句都得有,这就得根据实际情况来使用了。

我们来看这样一个例子:

#include <stdio.h>
//星期1~5是学习日
//星期6~7是休息日
int main()
{
	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;
	}
	return 0;
}

这个例子就告诉我们break的使用要根据情况而定的。

        在使用 switch 语句的时候,我们经常可能遇到一种情况,比如 switch 后的表达式中的值无法匹配代码中的 case 语句的时候,这时候要不就不做处理,要不就得在 switch 语句中加入default 子句(switch 后边的 expression 的结果不是 value1 ,也不是 value2 的时候,就会执行default 子句)。

以上面判断工作休息日例子,我们知道一个星期最多7天,星期八有么?没有!但并没有在scanf函数前告知不可以输入8,那么输入8又没有对应的case语句执行,这时候可以使用default子句,可以打印一个警告告知输入错误:

#include <stdio.h>
//星期1~5是学习日
//星期6~7是休息日
int main()
{
	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;
		default:
			printf("输入错误\n");
			break;
	}
	return 0;
}

运行结果:

当然不要忘记break,且输入其他非1~7的值同此。

3.switch语句中的case和default的顺序问题

        在 switch 语句中 case 子句和 default 子句有要求顺序吗? default 只能放在最后吗?其实,在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过我们通常是把 default 子句放在最后处理的。


三、if语句与switch语句使用选择

        我个人认为当所要构成的选择结构简单时(分支少)选择if语句,因为想到结构复杂要写多个else if就感觉心累……


 

标签:语句,case,int,else,switch,详解,printf
From: https://blog.csdn.net/ximiemie0525/article/details/136838107

相关文章

  • 函数的详解
    目录1.函数的概念2.库函数2.1库函数的概念2.2 标准库和头文件2.3库函数的使用方法2.4 头文件包含2.5 库函数文档的一般格式3.自定义函数3.1函数的与法形式3.2函数举例4.实参和形参4.1实参4.2形参5.return语句6.嵌套调用和链式访问6.1嵌套调用......
  • 开源计算机视觉库OpenCV详解
    OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库。OpenCV最初由Intel开发,后来支持由WillowGarage和Itseez(被Intel收购)进行的维护和更新。这个库旨在为实时的计算机视觉应用提供一个高效的、易于使用的环境,并且是用C++编写的,尽管它提供了......
  • 【C语言】结构体详解
    文章目录1、前言2、结构体变量的创建和初始3、结构体的特殊声明3、结构体的自引用5、结构体的内存对齐5.1对齐规则5.2为什么存在内存对齐?5.3修改对齐数6、结构体实现位段6.1什么是位段6.2位段的内存分配6.3位段的跨平台问题6.4位段的应用6.5位段使用的注意事项......
  • 【BFS】(代码详解)
    全面学习BFS的可以参照以下路径,本文章只附上部分代码的解释作为学习记录共勉(星星眼)原文链接:https://blog.csdn.net/m0_62881629/article/details/125072287给定一个n×mn×m的二维整数数组,用来表示一个迷宫,数组中只包含00或11,其中00表示可以走的路,11表示不可通过......
  • Java知识学习13(AQS详解)(转载)
    1、AQS介绍?AQS的全称为AbstractQueuedSynchronizer,翻译过来的意思就是抽象队列同步器。这个类在java.util.concurrent.locks包下面。AQS就是一个抽象类,主要用来构建锁和同步器。publicabstractclassAbstractQueuedSynchronizerextendsAbstractOwnableSynchronizer......
  • Redis系列十:Pipeline详解
    转载自:https://blog.csdn.net/w1lgy/article/details/84455579一、pipeline出现的背景:redis客户端执行一条命令分4个过程:发送命令-〉命令排队-〉命令执行-〉返回结果 1这个过程称为Roundtriptime(简称RTT,往返时间),mgetmset有效节约了RTT,但大部分命令(如hgetall,并没......
  • 【Linux】基础 IO(动静态库)-- 详解
    一、前言为什么要使用别人的代码?主要是为了提高程序开发的效率和程序的健壮性。当别人把功能都实现了,然后我们再基于别人的代码去做二次开发,那么效率当然就提高了。其次,这里基于的别人当然不是随便找的一个人,而特指的是顶尖的工程师,也就是说如果我们的代码出了问题,一般不会......
  • Java抽象类和接口详解
    1.抽象类的概念和语法实现 当一个类中的信息不足以描述一个具体的对象的时候,我们可以将这个类定义为抽象类。那么我们怎么定义出一个抽象类呢?我们要采用一个关键字abstract。下面我们来看具体代码:abstractclassAnimal{publicStringname;publicintage;......
  • 【DOM】重绘与重排详解及在性能优化中的应用
    DOM树表示页面结构渲染树表示DOM节点如何展示DOM树中需要展示的节点在渲染树中至少存在一个对应的节点(隐藏的DOM元素在渲染树中没有对应的节点)。渲染树中的节点被称为“帧(frames)”或“盒(boxes)”。符合CSS模型的定义。理解页面元素为一个具有内边距、外边距、边框、位置......
  • JDBC详解
    文章目录JDBC快速入门获取数据库连接4种方式方式一:获取Driver实现类对象方式二:使用反射动态加载方式三:使用DriverManager替换Driver方式四:使用DriverManager自动完成注册ResultSet结果集代码示例Statement和PreparedStatement预处理机制PreparedStatement代码封装J......