LinuxC——分支语句

2023-11-10

在C程序中,我们经常会根据一个表达式的结果来执行不同的操作。这个时候我们就需要用到分支语句。

本篇博客将介绍几种分支语句。

一、if 语句

if语句的通用形式

if (expression)
    statement

if语句的用法,首先对expression求值,如果这个值为真,那么就执行statement,如果为假,那么就跳过statement,继续执行下一条语句。

通常,expression是一个关系表达式,即比较两个量的大小。

用一个例子来说明这个if语句的用法

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;

	if(a > b)
	{
		printf("a > b\n");
	}

	printf("第一次比较结束\n");

	if(a < b)
	{
		printf("a < b\n");
	}

	printf("第二次比较结束\n");

	return 0;
}

这个例子首先给a,b分别初始化,然后执行第一个if语句,a > b 为假,所以不会打印 a > b,会跳过这一句,接下去,输出“第一次比较结束”。程序继续执行,便遇到了第二条 if 语句,判断 a < b 成立,所以会执行里面的printf语句,打印 a < b,然后程序继续执行,打印“第二次比较结束”,程序继续执行至结束。

下面是程序的结果


二、if else 语句

if else 语句的通用形式

if (expression)
    statement1
else
    statement2

if else 语句的用法,首先对expression求值,如果值为真,那么就执行statement1,如果值为假,那么就执行statement2。

使用if else 语句的时候最好养成良好的习惯,要注意缩进。

用一个简单的例子来看一下if else语句的用法

#include <stdio.h>

int main()
{
	int a = 1;
	int b = 2;

	if(a > b)
	{
		printf("a > b\n");
	}
	else
	{
		printf("a < b\n");
	}

	return 0;
}

上面的代码首先分别给a和b初始化,然后判断a > b 是否成立,如果成立就输出 a > b, 否则就输出a < b。

最后输出的结果是这样的。


if语句的嵌套

有时候我们会需要将几个if语句进行嵌套使用,这个时候就需要注意if 和 else的匹配。

【注】:else 总是和离它最近的一个并且没有匹配的 if 进行匹配。

首先来看一个糟糕的例子

int a = 1;
int b = 2;
int c = 3;

if(a > b)
	if(b > c)
		printf("测试语句1\n");
else
{
	printf("测试语句2\n")
}
else
{
	printf("测试语句3\n");
}

上面的这两个else和if该怎么匹配呢,首先要寻找离第一个else最近且没有匹配的 if 进行匹配,我们可以看到第二个 if 就符合这两个条件,所以第一个else应该与第二个if匹配。很自然的第一个if 和 最后一个else 匹配。

当然上面这是一个糟糕的例子,很多人看了都会头大,这个时候我们就需要有良好的编程规范,所以我们要适当的缩进并且加上大括号,来看一下改进后的例子

int a = 1;
int b = 2;
int c = 3;

if(a > b)
{
	if(b > c)
		printf("测试语句1\n");
	else
	{
		printf("测试语句2\n")
	}
}
else
{
	printf("测试语句3\n");
}

改进之后就能很容易的看出else 和 if的匹配关系了,但是只靠缩进也不能完全看出它们匹配关系,所以还是要记住上面的这个规则。

三、switch语句

当我们的程序有很多的选项时,用if else 语句也是可以进行的,但是C语言提供了一个更为方便的语句,switch语句。

switch语句的构造

switch (整型表达式)
{
	case 常量1:
		语句
	case 常量2:
		语句
	default :
		语句
}
【注】 这里的整型表达式的值应该是一个整数值(包括char类型),case 后面的必须是常量,不能用变量作为case的标签

用法

首先会计算整型表达式的值,然后根据求出来的值来寻找case标签,如果找到对应的标签就会从这个标签后面的语句开始依次执行如果希望只执行一个标签后面的内容,需要在执行完的语句后加上break。如果没有找到相应的case标签就会执行default 后面的语句。

用一个简单例子来说明一下这个语句的用法

首先是没有加break语句的情况

#include <stdio.h>

int main()
{
	int num = 2;

	switch(num)
	{
		case 1:
			printf("测试语句1\n");
		case 2:
			printf("测试语句2\n");
		case 3:
			printf("测试语句3\n");
		default :
			printf("没有与之匹配的标签\n");
	}

	return 0;
}

这里num的值是2, 所以会找到与之相匹配的标签,打印“测试语句2”,因为没有break,所以会一直执行下去直到程序结束。

看看运行的结果是怎么样的


和我们预计的一样,但是我们的本意应该是只执行相应标签后面的内容,其他的标签后面的内容不执行,我们在每个printf语句后加上break

switch(num)
{
	case 1:
		printf("测试语句1\n");
		break;
	case 2:
		printf("测试语句2\n");
		break;
	case 3:
		printf("测试语句3\n");
		break;
	default :
		printf("没有与之匹配的标签\n");
		break;
}

再来看看结果


这次只是输出了“测试语句2”,符合了我们的本意。

在很多情况下,switch中都会加上break,因为我们用到这个语句的时候,就是根据多种不同的情况来执行不同才操作,所以往往都需要加上break。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LinuxC——分支语句 的相关文章

  • MVC 2视图显示错误的模型信息

    我在一个项目中使用 MVC 2 但我遇到了视图问题 在控制器中我有代码 return View calendarDay 如果我调试这一行并检查 calendarDay 它会告诉我 calendarDay Id 属性等于 2 在视图中我有一些
  • asm、asm 易失性内存和破坏性内存之间的区别

    在实现无锁数据结构和定时代码时 通常需要抑制编译器的优化 通常人们使用asm volatile with memory在 clobber 列表中 但有时你会看到asm volatile或者只是一个简单的asm破坏记忆 这些不同的语句对代码生
  • 嵌套绑定表达式

    这是一个后续问题我之前的问题 https stackoverflow com questions 2735294 templates function pointers and c0x include
  • 改装和授权标头

    目前 我正在向我的请求添加授权标头 如下所示 文件 SomeFile cs public interface ITestApi Get api test id Task
  • 减少最大值并保存其索引

    int v 10 2 9 1 3 5 7 1 2 0 0 int maximo 0 int b 0 int i pragma omp parallel for shared v private i reduction max maximo
  • 具有 Nhibernate 设计问题的领域模型

    我正在尝试进入 DDD with C 世界 我使用NHibernate作为我的ORM工具 因此尝试开发一个PI Persistence Ignorance 模型 但是 在我的一些实体 表示为 POCOS 中 我的属性设置器中有业务规则 例如
  • 值类型数组如何存储在 .NET 对象堆中?

    在 NET中 诸如int之类的值类型对象存储在内存中 引用类型对象需要为引用和对象单独分配内存 并且对象存储在 NET对象堆中 而Array是在堆中创建的 那么int 等值类型的数组如何存储在堆中呢 这是否意味着值类型对象可以存储在堆中而无
  • C#:如何计算纵横比

    我对编程比较陌生 我需要根据给定尺寸 例如 axb 计算纵横比 16 9 或 4 3 我如何使用 C 来实现这一点 任何帮助将不胜感激 public string AspectRatio int x int y code am lookin
  • 清除指针向量[重复]

    这个问题在这里已经有答案了 假设我定义了一个这样的类 class foo private std vector lt int gt v public void bar1 for int i 0 i lt 10 i int a new int
  • dotnet core 创建文件名中不含“CoreFxPipe_”的命名管道

    使用以下命令创建命名管道时命名管道客户端流 or 命名管道服务器流dotnet core 的类中 关联的 管道 看起来实际上是一个套接字 已自动将 CoreFxPipe 添加到文件名的前面 有没有一种非黑客的方法来防止这种行为 我只是希望文
  • 使用 MemoryCache 而不是普通的旧 Dictionary 的令人信服的理由是什么

    我刚刚遇到内存缓存 http msdn microsoft com en us library system runtime caching memorycache aspx这是 NET 4 中的新增功能 我知道如果你想的话它会很有用 限制
  • 在 Visual Studio 2017 mac 上安装扩展 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试在 Visual Studio for Mac 上安装 Visual Studio Marketplace 扩展 但是 Vi
  • 从 Windows 选择声音并播放它们

    我有一个 WinForms 应用程序 该应用程序有一个 首选项 部分 用户可以在其中选择显示警报时播放哪些声音 是否可以有一个组合框 用户可以从 Windows 存储的声音中进行选择 例如 紧急停止 紧急蜂鸣 等 这些可以在 控制面板 gt
  • 静态成员函数中的封闭类的 C++ 类型

    我认为这是完全不可能的 但如果呢 在任何版本的 C 中 是否有可能以某种方式获取静态成员函数中封闭类的类型 class Impossible public static void Fun typedef Impossible Enclosi
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • 设置了 OFN_ALLOWMULTISELECT 标志的 GetOpenFileName()

    我正在尝试使用 GetOpenFileName 通用对话框调用来弹出打开对话框并允许用户选择多个文件 我设置了 OFN ALLOWMULTISELECT 标志 并设置了 OFN EXPLORER 因此我得到了 新样式 文件选择框 当我设置
  • boost::bind 会导致开销吗?

    我目前正在从事网络软件方面的工作 它有一个主要类 server这显然代表一个服务器实例 A server实例可以发送请求 并通过回调通知用户响应 代码如下 class server public typedef boost function
  • 将变量传递给 SSIS 中的项目参数

    我是这个网络的新手 希望我能找到这个问题的答案 我有一个 SSIS 项目 其中包含多个使用项目参数的包 我正在尝试更新项目参数 例如 PeriodStart 2014年5月31日 我找不到动态写入项目参数的方法 我在 4 0 框架中使用 V
  • 对数据绑定组合框进行排序的最佳方法是什么?

    我对此做了一些研究 似乎对数据绑定组合框进行排序的唯一方法是对数据源本身进行排序 在本例中为数据集中的数据表 如果是这种情况 那么问题就变成对数据表进行排序的最佳方法是什么 组合框绑定在设计器中设置初始化使用 myCombo DataSou
  • Windows 安装程序 (C#) 错误代码 2869

    我在 VS 2005 中有一个项目 其中有一个控制台应用程序和一个与安装该应用程序关联的安装项目 我在控制台应用程序中还有一个安装程序类 安装项目将使用它在安装前进行一些验证 这些任务正在检查数据库连接字符串并检查某些目录位置以确保它们在安

随机推荐

  • [4G&5G专题-122]:认证-华为认证概述

    1 链接 https e huawei com cn talent cert navType authNavKey 2 华为认证概述 3 认证等级 HCIA 工程师等级 HCIP 高级工程师等级 HCIE 专家级 4 学习培训 4 1 概述
  • JavaScript中结果转换为带有“千位分隔符”的数字

    在开发有关金额方面需求的时候 我们往往都需要对金额的显示进行一些处理 例如 将金额转换为带有 千位分隔符 的数字 像我们银行卡里的余额 购买商品时的总金额 就会有这一方面的需求 那么到底要怎么样去转换呢 这就需要用到 JavaScript
  • Hexo+Butterfly主题博客添加音乐播放器的简单版教程

    博客添加背景音乐 前言 基于Hexo框架 主题为Butterfly的个人博客 效果图 实现个人博客拥有全局吸底音乐播放器 即背景音乐 实现步骤 添加音乐播放器插件 可选择在vscode webstorm终端运行 一定要在博客项目文件中运行
  • IntelliJ IDEA 的 Spring 项目如何查看 @Value 的配置和值

    当你打开项目或者项目中的文件的时候 如果你有 Spring 的 Value 的配置 Intellij 将会自动将参数替换为值 如果你单击上面的值 那么这个配置参数将会显示为配置的参数名 如果你还想显示值的话 你需要重新打开这个文件或者项目
  • C++ 基础(数组)

    数组 是同一类型的多个元素的集合 声明了一个名为 a 的具有10个整数的数组 数组中的第一个元素 索引为0 设置为50 int a 10 a 0 50 数组初始化语法 int fib 5 0 1 1 2 3 或者使用循环 int array
  • Seaborn5分钟入门(六)——heatmap热力图

    微信公众号 Python读财 如有问题或建议 请公众号留言 Seaborn是基于matplotlib的Python可视化库 它提供了一个高级界面来绘制有吸引力的统计图形 Seaborn其实是在matplotlib的基础上进行了更高级的API
  • 假设检验笔记

    假设检验 就是做了一个假设 H 然后通过实验得到相关的统计数据判断 H 是否 大概率 成立 或者有多大把握认为 H 成立 这个 H 一般是一个与分布 统计量相关的的命题 如 H P 硬 币 朝
  • 图片即时优化的三种简单解决方案

    本文要点 Web页面中的图片往往是页面加载缓慢的最主要原因 图片优化很复杂 涉及大小调整 裁剪 格式转换及质量参数微调 如今 有的云服务可以即时优化图片 极大地改善用户浏览包含图片的Web页面时的体验 云服务提供了简单的API用于操作图片
  • 200. 岛屿数量-Java

    文章目录 200 岛屿数量 https leetcode cn com problems number of islands 题目概述 算法思路 1 深度优先搜索 代码实现 复杂度分析 2 广度优先搜索 分离行与列的方法 代码实现 复杂度分
  • 产品推介

    基线检测服务 正式发布 产品概述 在用户充分授权的情况下 对用户云上系统进行全面的安全基线检测 帮助用户掌握云上系统整体的安全脆弱性状况 并依据检测结果与用户业务模式特点 提供有针对性的安全修补建议 降低系统的安全威胁 漏洞扫描服务 正式发
  • Yule-Walker方程

    零化滤波器的来源 在有限新息率中 参数的估计问题可以转化为谱估计问题 而谱估计问题可以采用零化滤波器算法去解决 其核心在于 z z z变换和Yelu Walker方程的求解 这篇博客重点讲一下Yelu Walker方程的求解 Yelu Wa
  • 毕业设计--基于深度学习的常见苹果叶片病害识别与病斑分割方法研究

    目录 前言 课题背景和意义 实现技术思路 实现效果图样例 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度
  • 【C语言】使用C语言编写对密码强度的检测,检测出结果:弱、中等、强

    可以使用 C 语言编写一个函数来检测密码强度 以下是一个简单的实现 include
  • 动态规划之背包问题

    本文有视频版 0 1背包问题详解 后台天天有人问背包问题 这个问题其实不难啊 如果我们号动态规划系列的十几篇文章你都看过 借助框架 遇到背包问题可以说是手到擒来好吧 无非就是状态 选择 也没啥特别之处嘛 今天就来说一下背包问题吧 就讨论最常
  • 博客之星规则能否参照“金球奖”

    文章目录 课前小差 粉丝对我的价值 粉丝数量的提升 KOL与粉丝链接 粉丝影响收入 博客之星规则设想 博客之星新玩法 内部评审 展望2023 写在最后 课前小差 哈喽 大家好 我是几何心凉 这是一份全新的专栏 唯一得倒CSDN王总的授权 来
  • drop与delete的区别

    drop与delete的区别 drop主要用于删除结构例如删除数据库 drop database XX 删除表 drop table XX 字段也是结构的一种 也可以使用drop了 对的 但是我们改变了表结构要先alter方法 例如 我们要
  • vSphere Client(Vcenter)上传ISO镜像

    不少新手在ESXi上安装好虚拟机后 都要寻找浏览器的ios镜像 但同学们会在这里卡顿 找不到上传ios的路径 今天就来讲一讲 上传的问题 一 方法一 我初学时 一样在这里卡顿 找不到上传的路径 在网上搜索 确实找到了一种上传的方法 在这里转
  • keil编译后.c文件前面没有+号

    如下图 程序的 c文件前面没有 号 已经在show include file dependencies前面打勾了 看到下面的提示是编译出问题了 点击魔术棒 在Target Code Generation里面选择默认的编译器 然后重新编译 发
  • 三维目标检测新SOTA---ADFDetV2论文解读

    问题 本文提出了一种单阶段的三维目标检测算法 并在文中分析了二阶段三维目标检测算法的不必要性 其所提算法在waymo实时目标检测竞赛中取得了第一的成绩 其性能超过了所有单阶段和多阶段的目标检测算法 作者首先分析了二阶段目标检测算法主要有两个
  • LinuxC——分支语句

    在C程序中 我们经常会根据一个表达式的结果来执行不同的操作 这个时候我们就需要用到分支语句 本篇博客将介绍几种分支语句 一 if 语句 if语句的通用形式 if expression statement if语句的用法 首先对express