C语言分支结构详解

1. if 语句

在本篇博客文章中,我们将深入探讨C语言中的if语句及其相关用法。if语句是一种用于条件判断的分支语句,它允许我们根据条件的真假来执行不同的代码块。

1.1 if 语句的基本语法和用法

if语句的基本语法如下所示:

if (条件) {
// 条件为真时执行的代码块
}

在这个语法结构中,条件是一个布尔表达式,如果条件的值为真(非零),则执行if语句块中的代码。

1.2 else 语句和 else if 语句的使用

除了 if 语句,我们还可以使用 else 语句和 else if 语句来处理条件的不同情况。else 语句在 if 条件以及 else if 条件(假设存在)均为假时执行,而 else if 语句用于在多个条件之间进行判断。

ifelse if 均需条件,从 if 往下遍历条件,若所有条件不符合,执行 else 后的代码。

int num = 10;

if (num > 0) {
printf("数字是正数\n");
} else if (num < 0) {
printf("数字是负数\n");
} else {
printf("数字是 0\n");
}

在这个示例中,我们根据 num 的值输出不同的结果。如果 num 大于0,我们打印"数字是正数";如果 num 小于0,我们打印"数字是负数";如果 num 等于0(不大于0且不小于0,就是0),因此我们打印"数字是 0"。

1.3 if 语句的嵌套和多重条件判断

在C语言中,我们可以嵌套if语句,这意味着在一个 if 语句块内部包含另一个if语句块。这样可以实现更复杂的条件判断逻辑。

int num = 10;

if (num > 0) {
if (num % 2 == 0) {
printf("数字是正偶数\n");
} else {
printf("数字是正奇数\n");
}
} else if (num < 0) {
printf("数字是负数\n");
} else {
printf("数字是 0\n");
}

在这个示例中,我们首先判断num是否大于0,如果是,则进一步判断num是否为偶数或奇数。根据条件的不同,我们输出相应的结果。

1.4 悬空 else 问题及其解决方法

在C语言中,else 语句总是与最近的 if 语句配对,这就导致了一个被称为"悬空 else"的问题。当我们有多个嵌套的if语句时,可能会出现 else 语句与我们预期的 if 语句不匹配的情况。

为了解决悬空 else 问题,可以使用花括号(代码块)来明确 if 语句的范围,从而避免 else 语句与错误的 if 语句配对。

首先请看这个示例,初学者可能发现预期的输出和实际的输出有出入。

int num = -10;

if (num > 0)
if (num % 2 == 0)
printf("数字是正偶数\n");
else
printf("数字是负数\n");

在这个示例中,初学者会下意识的根据缩进格式来判断,理所当然的认为上述代码打印"数字是负数",实际情况是什么都不会打印!!!因为else 语句总是与最近的 if 语句配对

我们使用了花括号将 if 语句的范围明确标记出来,从而避免了悬空 else 问题。

int num = -10;

if (num > 0) {
if (num % 2 == 0) {
printf("数字是正偶数\n");
}
} else {
printf("数字是负数\n");
}

2. 关系操作符

在本节中,我们将介绍C语言中常用的关系操作符。在C语言中,任何非零值都被视为真(true),而零值被视为假(false)。关系运算符的结果大致上可以认为返回的是 bool 类型的 true 或者 false,但是,严格来说是int类型的1(表示真)或0(表示假)。

2.1 关系操作符的种类和用法

C语言中的关系操作符包括以下几种:

  • ==:等于
  • !=:不等于
  • >:大于
  • <:小于
  • >=:大于等于
  • <=:小于等于

我们可以使用这些操作符在条件判断中比较两个值的大小关系。

2.2 关系操作符的返回值类型

关系操作符的返回值类型是布尔类型,即 int 型的0或1。当关系成立时,返回1(真),否则返回0(假)。

2.3 关系操作符在条件判断中的应用

关系操作符常常用于条件判断语句中,例如 if 语句、while 循环等。通过比较两个值的大小关系,我们可以根据条件的真假来执行不同的代码块。

下面是一个使用关系操作符的示例:

int a = 5, b = 10;

if (a == b) {
printf("a 与 b 相等\n");
} else if (a < b) {
printf("a 比 b 小\n");
} else {
printf("a 比 b 大\n");
}

在这个示例中,我们比较了变量a和b的值,并根据比较结果输出不同的结果。

3. 条件操作符

条件操作符(也称为三元运算符、三目运算符)是C语言中一种简洁的条件表达式。它允许我们根据条件的真假选择不同的值。

3.1 条件操作符的语法和用法

条件操作符的语法如下所示:

条件 ? 表达式1 : 表达式2

如果条件为真,则返回表达式1的值;如果条件为假,则返回表达式2的值。

通常来讲,是可以支持多条三元运算嵌套的,然而在我看来这并不是写代码的良好习惯,可读性太差!

3.2 条件操作符与if语句的对比

条件操作符提供了一种简洁的条件判断方式,它可以替代简单的 if 语句。使用条件操作符可以使代码更加简洁和易读。

下面是一个使用条件操作符的示例:

int age = 18;
char* result = (age >= 18) ? "你是成年人" : "你是未成年"; printf("%s\n", result);

在这个示例中,我们根据年龄的值选择不同的结果。如果年龄大于等于18岁,我们输出"你是成年人";否则,我们输出"你是未成年"。

4. 逻辑操作符

逻辑操作符用于在条件判断中组合多个条件,并根据逻辑关系的真假进行逻辑运算。

4.1 逻辑操作符的种类和用法

C语言中常用的逻辑操作符包括以下几种:

  • &&:逻辑与(AND)
  • ||:逻辑或(OR)
  • !:逻辑非(NOT)

逻辑与操作符(&&)在两个条件都为真时返回真,逻辑或操作符(||)在两个条件中至少一个为真时返回真,逻辑非操作符(!)用于取反。

4.2 逻辑操作符的短路运算特性

逻辑操作符具有短路运算的特性,即在某个条件已经确定的情况下,将不再计算后续的条件。

下面是一个逻辑操作符短路运算的示例:

int num = 10;

if (num > 0 && num < 100) {
printf("Number is between 0 and 100\n");
}

在这个示例中,如果 num 大于0,才会继续判断 num 是否小于100。如果 num 小于等于0,后续的条件判断将被短路,不再执行。

逻辑与:左假则右不执行,因为一假则假,既然都是假的了,何必浪费时间往右继续判断?

逻辑或:左真则右不执行,因为一真则真,既然都是真的了,那就不用在继续判断啦!

5. switch 语句

现在,让我们来探讨C语言中另一个重要的分支语句:switch 语句。

5.1 switch 语句的基本语法和用法

switch 语句是一种用于多分支选择的语句,它根据表达式的值选择不同的执行路径。

switch 语句的基本语法如下所示:

switch (表达式) {
case 值1:
// 执行语句块1
break;
case 值2:
// 执行语句块2
break;
...
default:
// 默认执行语句块
break;
}

在这个语法结构中,表达式的值将与每个 case 的值进行比较,如果匹配,则执行相应的语句块。如果没有匹配的 case,则执行 default 语句块(可选)。

下面是一个使用 switch 语句的示例:

int choice = 2;

switch (choice) {
case 1:
printf("You chose option 1\n");
break;
case 2:
printf("You chose option 2\n");
break;
case 3:
printf("You chose option 3\n");
break;
default:
printf("Invalid choice\n");
break;
}

在这个示例中,根据变量choice的值,我们选择不同的菜单项进行输出。

5.2 switch语句中的执行顺序问题

在 switch 语句中,case 的执行顺序是从上到下的,即匹配到的第一个 case 执行后,会继续执行后续的 case 语句块,直到遇到 break 语句或 switch 语句结束。

如果在 case 语句块中没有使用 break 语句,将会发生case穿透现象,即执行完一个case后,会继续执行下一个case语句块,直到遇到break语句或switch语句结束。

下面是一个"case穿透"的示例:

int num = 2;

switch (num) {
case 1:
printf("Number is 1\n");
case 2:
printf("Number is 2\n");
case 3:
printf("Number is 3\n");
default:
printf("Invalid number\n");
}

在这个示例中,如果num的值为2,将会输出"Number is 2"、"Number is 3"和"Invalid number"。这是因为没有在每个case语句块中使用break语句,导致执行顺序继续向下执行。

为了避免case穿透问题,我们可以在每个case语句块的末尾添加break语句,或者使用合适的控制流语句(如if语句)来控制执行流程。

5.3 switch语句的应用场景

switch语句在实际应用中非常常见,特别适用于根据不同的选择执行不同的操作。

例如,在菜单选择、状态机等场景中,我们可以使用switch语句来处理多个固定的选项。

下面是一个使用switch语句的示例:

int choice;

printf("Please enter your choice (1-3): ");
scanf("%d", &choice); switch (choice) {
case 1:
printf("You chose option 1\n");
break;
case 2:
printf("You chose option 2\n");
break;
case 3:
printf("You chose option 3\n");
break;
default:
printf("Invalid choice\n");
break;
}

在这个示例中,根据用户输入的choice值,我们选择不同的菜单项进行输出。

5.4 switch 语句与 if 语句比较

Switch语句 If语句
用途 多分支选择,适用于固定值的比较 复杂条件判断,适用于灵活的条件逻辑
匹配方式 根据表达式的值与case值进行匹配 根据条件表达式的真假进行匹配
执行顺序 从匹配到的case开始执行,直到遇到break语句或switch结束 从上到下依次执行,根据条件的真假执行相应的代码块
默认执行 可选的default语句块在没有匹配的case时执行 可选的else语句块在条件为假时执行
代码结构 可以将多个选项组织在一起,结构清晰 适用于灵活的条件判断,代码结构较自由
使用场景 处理多个固定选项的选择 处理复杂的条件逻辑,需要灵活的条件判断
示例 根据菜单选项执行不同的操作 根据年龄和性别判断是否满足某个条件

一文带你掌握C语言的分支结构的更多相关文章

  1. C语言之分支结构 if(二)

    If的第三种和第四种形式(tips:也是比较常用的形式) 3).if语句第三种形式: 简单来说就是任意的if或者else里面还可以嵌套任意的if-else语句 语法: if(表达式){ if(表达式2 ...

  2. C语言之分支结构 if(一)

    一 程序的三种基本结构 顺序结构:程序从上往下依次执行,这个叫顺序结构 分支结构:有选择的执行或者不执行某段代码 循环结构:重复的执行某段代码 二 分支结构之if 最简单的俩种用法 (tips: if ...

  3. 一文带你了解elasticsearch

    一文带你了解elasticsearch cxf2102100人评论160人阅读2019-07-02 21:31:36   elasticsearch es基本概念 es术语介绍 文档Document ...

  4. 一文带你了解 C# DLR 的世界

    一文带你了解 C# DLR 的世界 在很久之前,我写了一片文章dynamic结合匿名类型 匿名对象传参,里面我以为DLR内部是用反射实现的.因为那时候是心中想当然的认为只有反射能够在运行时解析对象的成 ...

  5. 一文带你看清HTTP所有概念(转)

    一文带你看清HTTP所有概念   上一篇文章我们大致讲解了一下 HTTP 的基本特征和使用,大家反响很不错,那么本篇文章我们就来深究一下 HTTP 的特性.我们接着上篇文章没有说完的 HTTP 标头继 ...

  6. 让自己写的电子笔记连文带图全平台兼容(MarkDown图片显示兼容)

    目录 一.工具使用 语言使用:MarkDown 简介 使用原因 使用方法 软件使用:Typora 简介 环境设置搭建 1)搭建图床 2)配置PicGo 3)配置typora 4)测试 图片上传测试 平 ...

  7. JDBC、ORM、JPA、Spring Data JPA,傻傻分不清楚?一文带你厘清个中曲直,给你个选择SpringDataJPA的理由!

    序言 Spring Data JPA作为Spring Data中对于关系型数据库支持的一种框架技术,属于ORM的一种,通过得当的使用,可以大大简化开发过程中对于数据操作的复杂度. 本文档隶属于< ...

  8. 精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)

    前提介绍 很多小伙伴,都跟我反馈,说自己总是对JVM这一块的学习和认识不够扎实也不够成熟,因为JVM的一些特性以及运作机制总是混淆以及不确定,导致面试和工作实战中出现了很多的纰漏和短板,解决广大小伙伴 ...

  9. Istio是啥?一文带你彻底了解!

    原标题:Istio是啥?一文带你彻底了解! " 如果你比较关注新兴技术的话,那么很可能在不同的地方听说过 Istio,并且知道它和 Service Mesh 有着牵扯. 这篇文章可以作为了解 ...

  10. 一文带您了解5G的价值与应用

    一文带您了解5G的价值与应用 5G最有趣的一点是:大多数产品都是先有明确应用场景而后千呼万唤始出来.而5G则不同,即将到来的5G不仅再一次印证了科学技术是第一生产力还给不少用户带来了迷茫——我们为什么 ...

随机推荐

  1. 一篇博客带你上手Git

    概述 安装Git 下载官方网站,下载后安装包样式:双击安装,安装成功后右键文件会有如下选项证明安装成功. 基本配置 设置用户信息,桌面右键,选择Git bash here hecheng@LAPTOP ...

  2. Azure Terraform(十四)Azure Key Vault 的机密管理

    一,引言 最近有网友私信我,将 Terraform 部署到 Azure 是一种将基础结构作为代码进行管理的好方法,但是如何使用 Azure Key Vault 来存储我们的 Secret ?在这篇博文 ...

  3. ZS Shuffles Cards 题解

    ZS Shuffles Cards 题解 我们把每一次抽一些数字牌再抽到 joker 视作一局游戏. 每局期望轮数 首先考虑 \(f_i\) 表示每一局游戏抽出 \(i\) 张牌的概率. 那么就是先抽 ...

  4. LeetCode952三部曲之一:解题思路和初级解法(137ms,超39%)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 题目描述 难度:困难 编程语言:Java 给定一个由不 ...

  5. mybatis数据库字段自动填充

    背景描述 目前,大多数项目的数据库设计,都会添加一些公共字段,比如version(版本号).deleted(逻辑删除标识).create_time.update_time.create_by.upda ...

  6. windows无法连接VMware虚拟机的linux

    遇到的问题:今天使用xshell连接虚拟机,无法连接. 解决过程: 1.测试ping, linux虚拟机能ping通windows主机,可是windows主机ping不通linux虚拟机. 2.查看v ...

  7. 解决Eclipse中启动Tomcat报unable to start within 45 seconds问题

    启动项目的时候报Server Tomcat v8.0 Server at localhost was unable to start within 45 seconds. If the server ...

  8. centos7.6 安装Jenkins

    一.安装java环境 yum install -y java-11-openjdk* 三.将Jenkins存储库添加到yum repos wget -O /etc/yum.repos.d/jenkin ...

  9. SOA认知和方法论

    1 前言 1.1 架构分类 在软件设计领域,企业架构通常被划分为如下五种分类: 如何理解架构分类依据及其彼此之间的关系?业务是企业赖以生存之本,因此业务架构是基础.是灵魂,其他一切均是对业务架构的支撑 ...

  10. 21.3 Python 使用DPKT分析数据包

    dpkt项目是一个Python模块,主要用于对网络数据包进行解析和操作.它可以处理多种协议,例如TCP.UDP.IP等,并提供了一些常用的网络操作功能,例如计算校验和.解析DNS数据包等.由于其简单易 ...