【C语言初阶】分支语句

🌟博主主页:我是一只海绵派大星

📚专栏分类:C语言

❤️感谢大家点赞👍收藏⭐评论✍️

目录

一、什么是语句

二、if语句

悬空else  

 三、switch语句

default 

四、switch语句与if-else语句性能对比如何?


一、什么是语句

 C语句可分为以下五类:

  • 表达式语句
  • 函数调用语句
  • 控制语句
  • 复合语句
  • 空语句
控制语句 用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成, C 语言有九种控制语句。

二、if语句

语法结构:
if ( 表达式 )
语句
if ( 表达式 )
语句 1
else
语句 2
// 多分支    
if ( 表达式 1 )
语句 1
else if ( 表达式 2 )
语句 2
else
语句 3
#include <stdio.h>
int main()
{int age = 0;scanf("%d", &age);if(age<18){printf("少年\n");}else if(age>=18 && age<30){printf("青年\n");}else if(age>=30 && age<50){printf("中年\n");}else if(age>=50 && age<80){printf("老年\n");}else{printf("老寿星\n");}}

悬空else  

"悬空else"(dangling else)是编程中一个常见的错误,指的是在if-else语句中,else部分没有正确地与最近的未匹配的if语句配对。这通常是因为嵌套的if语句没有正确地使用大括号({})来明确指示其范围。

错误示例:

if (condition1)if (condition2)printf("Condition 1 and Condition 2 are true.\n");
elseprintf("Only Condition 1 is true.\n");

在这个例子中,由于没有使用大括号,编译器无法确定else是与内部的if还是外部的if配对。为了解决这个问题,我们需要使用大括号来明确指示if-else语句的范围:

if (condition1) {if (condition2) {printf("Condition 1 and Condition 2 are true.\n");}
} else {printf("Only Condition 1 is true.\n");
}

 else明确地与外部的if语句配对,而内部的if语句则独立存在。这样可以避免悬空else的问题。

 三、switch语句

switch语句是一种多分支选择结构,用于根据一个表达式的值来执行不同的代码块。它通常比多个嵌套的if-else语句更简洁和易于理解。switch语句的基本语法如下:

switch (expression) {case constant1:// Code to be executed if expression equals constant1break;case constant2:// Code to be executed if expression equals constant2break;// ... more cases ...default:// Code to be executed if none of the constants match the expression
}

这里是switch语句的一些关键点:

  1. expression:这是一个表达式,其值将与case标签的值进行比较。
  2. case:每个case标签都有一个常量值,用于与expression的值进行比较。如果找到匹配的case,则执行该case后的代码块。
  3. breakbreak语句用于跳出switch语句,防止执行下一个case的代码。如果没有break,程序将继续执行下一个case的代码,直到遇到breakswitch语句结束。
  4. defaultdefault标签是可选的,当expression的值与任何case标签的值都不匹配时,将执行default标签后的代码块。

代码示例: 

#include<stdio.h>int main() {int day = 3;switch (day) {case 1:printf("Monday\n");break;case 2:printf("Tuesday\n");break;case 3:printf("Wednesday\n");break;case 4:printf("Thursday\n");break;case 5:printf("Friday\n");break;case 6:printf("Saturday\n");break;case 7:printf("Sunday\n");break;default:printf("Invalid day\n");}return 0;
}

default 

  • 写在任何一个 case 标签可以出现的位置。
  • 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。
  • 每个switch语句中只能出现一条default子句。
  • 但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。

四、switch语句与if-else语句性能对比如何?

switch语句和if-else语句在性能上的差异取决于多种因素,如编译器的优化、代码的结构和目标平台等。在大多数情况下,这两种结构的性能差异可以忽略不计。然而,在某些特定情况下,它们之间可能存在一些性能差异。以下是这两种结构在不同方面的性能对比:

1. 分支预测:现代处理器使用分支预测技术来提前知道将要执行的指令。当使用switch语句时,编译器可能会生成跳转表(jump table),这是一种允许处理器直接跳转到正确代码块的数据结构。这在某些情况下可能比if-else语句的分支预测更有效。

2. 代码大小:switch语句在某些情况下可能会产生较小的代码,因为它可以将多个条件分支合并到一个跳转表中。然而,这种优化取决于编译器和目标平台。对于if-else语句,每个条件分支都需要单独的指令,可能导致更大的代码大小。

3. 执行速度:在大多数情况下,switch语句和if-else语句的执行速度差别不大。然而,在某些特定情况下,switch语句可能更快,因为它可以利用跳转表进行快速查找。此外,switch语句通常更适合处理大量条件分支的情况,因为它的结构更简洁。

总之,switch语句和if-else语句在性能上的差异取决于具体情况和编译器的优化。在大多数情况下,这两种结构的性能差异很小,不足以影响程序的运行速度。因此,在选择使用哪种结构时,应更多地考虑代码的可读性和可维护性,而不是性能。当然,在性能关键的场景下,建议对不同结构进行基准测试,以确定最佳的实现方式。

🎁结语: 

本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,大星必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855318.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式技术导论 — 探索分析从起源到现今的巅峰之旅(消息队列)

探索分析从起源到现今的巅峰之旅 分布式队列 - Kafka架构特性可扩展性磁盘优化与顺序访问大容量存储与历史数据利用高效数据封装与压缩智能内存管理与OS缓存利用 Kafka发布/订阅模型Kafka架构分析Producer和Consumer接口交互Producer通过Topic发送数据Consumer通过Topic消费数据…

springboot项目mapper无法自动装配,未找到 ‘userMapper‘ 类型的Bean解决办法.

一开始我看到了这个回答&#xff1a;springboot项目mapper无法自动装配&#xff0c;未找到 ‘userMapper‘ 类型的 Bean解决办法&#xff08;含报错原因&#xff09;_无法自动装配。找不到 usermapper 类型的 bean。-CSDN博客 mapper无法自动装配&#xff0c;未找到 ‘userMap…

MyBatis系列四: 动态SQL

动态SQL语句-更复杂的查询业务需求 官方文档基本介绍案例演示if标签应用实例where标签应用实例choose/when/otherwise应用实例foreach标签应用实例trim标签应用实例[使用较少]set标签应用实例[重点]课后练习 上一讲, 我们学习的是 MyBatis系列三: 原生的API与配置文件详解 现在…

自定义Unity组件——ABManager(AB包管理器)

需求描述 在Unity3D引擎中&#xff0c;AB包作为常用的游戏资源存储格式之一。而对于资源管理我们就不得不谈到集中管理的优势了&#xff0c;通过统一的接口加载和卸载AB包及其中的资源将进一步提升我们的编程效率。本文将围绕这个需求进行尝试。 功能描述 1. AB包的加载包括同…

【C#上位机应用开发实战】—机器视觉检测

#机器视觉 在现代工业生产中&#xff0c;机器视觉检测技术扮演着越来越重要的角色。它通过计算机视觉技术来实现对工件的自动化检测和判断&#xff0c;大大提高了生产效率和产品质量。而在机器视觉检测的应用中&#xff0c;C#作为一种简洁易用且功能强大的编程语言&#xff0c…

报表开发工具DevExpress Reporting v23.2 - 增强PDF导出、多平台打印等

DevExpress Reporting是.NET Framework下功能完善的报表平台&#xff0c;它附带了易于使用的Visual Studio报表设计器和丰富的报表控件集&#xff0c;包括数据透视表、图表&#xff0c;因此您可以构建无与伦比、信息清晰的报表。 DevExpress Reporting控件日前正式发布了v23.2…

ClickHouse安装与下载22.3.2.2

ClickHouse安装与下载 目录 1. ClickHouse简介 1.1 ClickHouse优点&#xff1a; 1.2 ClickHouse缺点&#xff1a; 1.3 ClickHouse引擎&#xff1a; 1.3.1 数据库引擎 1.3.2 表引擎 2. ClickHouse下载安装 2.1 ClickHouse下载安装 2.2 ClickHouse使用 1. ClickHouse简…

中国剩余定理——AcWing 204. 表达整数的奇怪方式

中国剩余定理 定义 中国剩余定理最早出自我国古代的《孙子算经》&#xff0c;是数论中的一个重要定理。它描述了这样一种情况&#xff1a;在模运算下&#xff0c;对于一组线性同余方程组&#xff0c;存在唯一解的条件和求解方法。 运用情况 常用于在一些涉及到按不同模的余…

安全宣传咨询日活动向媒体投稿记住这个投稿好方法

在信息爆炸的时代,作为单位的信息宣传员,我肩负着将每一次重要活动,特别是像“安全宣传咨询日”这样的公益活动,有效传达给公众的重任。这份工作看似简单,实则充满了挑战,尤其是在我初涉此领域时,那段曲折而又难忘的投稿经历,至今记忆犹新。 初探投稿之海,遭遇重重困难 起初,我…

注册安全分析报告:PingPong

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞 …

vscode-关闭ts与js语义校验

1.ts与js语义校验 TypeScript&#xff08;TS&#xff09;和JavaScript&#xff08;JS&#xff09;在语义校验方面有很大的不同。TypeScript是一种静态类型检查的编程语言&#xff0c;它是JavaScript的一个超集&#xff0c;为JavaScript添加了类型系统和其他一些特性。而JavaScr…

12.爬虫---PyMysql安装与使用

12.PyMysql安装与使用 1.安装 PyMySQL2.使用PyMySQL2.1创建数据表2.2连接数据库2.3增加数据2.4修改数据2.5查询数据2.6删除数据2.7关闭连接 3.总结 1.安装 PyMySQL PyMySQL是Python中用于连接MySQL数据库的库&#xff0c;安装起来非常简单。通常情况下&#xff0c;只需要在命令…

从零开始:精通基于大型语言模型(LLM)的Agent应用开发

一、引言 随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;Large Language Model&#xff0c;简称LLM&#xff09;已经成为自然语言处理&#xff08;NLP&#xff09;领域的核心技术之一。这些模型&#xff0c;如GPT、BERT等&#xff0c;通过大量的文本数据训练…

八个精品ETL工具,总有一款适合您的业务需求!

在数字经济高速发展的今天&#xff0c;数据的价值愈发凸显。ETL&#xff08;Extract, Transform, Load&#xff09;工具作为数据集成的关键一环&#xff0c;不仅帮助企业高效管理海量数据&#xff0c;还能为商业决策提供实时洞察。本文将深入探讨目前市场上的8款领先ETL工具&am…

Java—装饰器模式

介绍 装饰器模式 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你动态地将行为添加到现有的对象中&#xff0c;而无需修改其代码。装饰器模式提供了比继承更灵活的功能扩展方式。 主要角色 Component&#xff1a;定义一个对…

变量不自动初始化

代码&#xff1a; /*《AVR专题精选》随书例程2.编程技巧项目&#xff1a;不对变量进行初始化文件&#xff1a;main.c说明&#xff1a;演示不对变量进行默认初始化的方法。在proteus仿真例程中&#xff0c;按下按键&#xff0c;就可以看到两个变量输出结果的变化。作者&#xf…

Python的print,input与注释的使用

1.print的使用 2.input的使用 3.如何注释 1.print的使用 1.1建立俩个变量a&#xff0c;b&#xff0c;直接把变量放在print的括号里面就会打印其的值。 1.2print可以同时打印多个&#xff0c;打印ab的值与字符串‘11’。 1.3先用chr&#xff08;&#xff09;函数去获取对应97…

剖析 Kafka 消息丢失的原因

文章目录 前言一、生产者导致的消息丢失的场景场景1&#xff1a;消息太大解决方案 &#xff1a;1、减少生产者发送消息体体积2、调整参数max.request.size 场景2&#xff1a;异步发送机制解决方案 &#xff1a;1、使用带回调函数的发送方法 场景3&#xff1a;网络问题和配置不当…

Python爬虫实战案例之——MySql数据入库

Hello大家好&#xff0c;我是你们的南枫学长&#xff0c;咱们今天来学——爬虫之MySql数据入库。 话不多说&#xff0c;导入咱们的老朋友&#xff1a; Pymysql就是我们Python里面的mysql库&#xff0c;主要功能就是用来连接MySql数据库&#xff0c;那么下载还是一样的操作去进…

自动驾驶规划-RTT* 算法 【免费获取Matlab代码】

目录 1.算法原理3.结果展示4.参考文献5.代码获取 1.算法原理 RRT(Rapidly-Exploring Random Trees) 快速随机扩展树&#xff0c;是一种单一查询路径规划算法。RRT 将根节点作为搜索的起点&#xff0c;然后通过随机撒点采样增加叶子节点的方式&#xff0c;生成一个随机扩展树&a…