当前位置: 首页 > news >正文

C语言入门-选择结构

在编程中,我们经常需要根据不同的条件执行不同的操作。C语言为此提供了几种非常实用的选择结构:条件运算符、逻辑运算、if语句和switch语句。接下来,让我们深入探讨这些重要的知识点,帮助你更好地理解和掌握C语言的选择结构。

1. 条件运算符

条件运算符,又称三元运算符,是C语言中唯一的三目运算符,形式为:

condition ? expression1 : expression2;

它的意思是:如果条件condition为真,则执行expression1,否则执行expression2

示例

int a = 5, b = 10;
int max = (a > b) ? a : b;
printf("The maximum value is %d\n", max);

在这个例子中,如果a大于bmax的值将是a,否则是b。因此,程序会输出b的值,即10

2. 条件和逻辑运算符

在C语言中,我们经常使用条件运算符来比较两个值,这些运算符包括:

  • >:大于

  • <:小于

  • >=:大于等于

  • <=:小于等于

  • ==:等于

  • !=:不等于

逻辑运算符用于将多个条件组合在一起,主要包括:

  • &&(逻辑与):只有当两个条件都为真时,结果才为真。

  • ||(逻辑或):只要有一个条件为真,结果就为真。

  • !(逻辑非):将条件的真假取反。

示例

int a = 5, b = 10;
if (a < b && b > 0) {printf("b is greater than a and positive.\n");
}

在这个例子中,条件a < b && b > 0同时满足,程序会输出b is greater than a and positive.

3. 混合运算示例

在编写代码时,条件运算、逻辑运算、算术运算和赋值运算常常会结合在一起使用。例如:

int x = 5, y = 10, z;
z = (x < y && y != 0) ? (x + y) : (x - y);
printf("The value of z is %d\n", z);

在这个例子中,x < y && y != 0的条件为真,因此z的值为x + y,即15

更复杂的混合运算示例

在实际编程中,不同运算符的优先级会影响运算结果,因此理解优先级非常重要。以下是一些混合运算的例子:

示例 1:逻辑运算与算术运算的结合

int a = 4, b = 3, c = 2;
int result = a + b * c > 10 || b - c < 1;
printf("The result is %d\n", result);

在这个例子中,优先级的顺序是:

  1. 先进行乘法 b * c,得到 3 * 2 = 6

  2. 然后进行加法 a + 6,得到 4 + 6 = 10

  3. 判断 10 > 10,结果为假。

  4. 接下来计算 b - c,得到 3 - 2 = 1

  5. 判断 1 < 1,结果为假。

  6. 最后使用逻辑或 || 进行判断,两个条件均为假,结果为 0

因此,程序会输出 The result is 0

示例 2:赋值运算与条件运算结合

int x = 5, y = 10;
int result = (x > y) ? (x = y + 2) : (y = x + 3);
printf("x = %d, y = %d, result = %d\n", x, y, result);

在这个例子中,x > y 为假,因此执行 y = x + 3,得到 y = 8,并将 8赋值给 result。程序会输出 x = 5, y = 8, result = 8

示例 3:混合算术、逻辑和条件运算

int a = 3, b = 4, c = 5;
int result = (a + b > c) && (b - c < a) ? (a * b) : (c / a);
printf("The value of result is %d\n", result);

在这个例子中:

  1. 先计算 a + b,得到 3 + 4 = 7

  2. 判断 7 > c,即 7 > 5,结果为真。

  3. 然后计算 b - c,得到 4 - 5 = -1

  4. 判断 -1 < a,即 -1 < 3,结果也为真。

  5. 逻辑与 &&的结果为真,因此执行 (a * b),得到 3 * 4 = 12

最终,程序输出 The value of result is 12

运算符优先级的影响

在C语言中,不同运算符有不同的优先级,这些优先级会直接影响表达式的计算顺序。下表列出了常见运算符的优先级,按照从高到低的顺序:

优先级运算符描述
1()括号,明确运算顺序
2!逻辑非
3*, /, %乘、除、取余
4+, -加、减
5<, <=, >, >=关系运算符
6==, !=等于、不等于
7&&逻辑与
8||逻辑或
9? :条件运算符(三目运算)
10=, +=, -=, *=赋值运算符

示例 4:优先级问题的详细分析

int x = 2, y = 3, z = 4;
int result = x + y > z && y * z < 20 || x - y > 0;
printf("The value of result is %d\n", result);

在这个例子中,计算顺序如下:

  1. 先计算 x + y,得到 2 + 3 = 5

  2. 判断 5 > z,即 5 > 4,结果为真。

  3. 计算 y * z,得到 3 * 4 = 12

  4. 判断 12 < 20,结果为真。

  5. 使用逻辑与 &&,两个条件都为真,因此结果为真。

  6. 接下来计算 x - y,得到 2 - 3 = -1

  7. 判断 -1 > 0,结果为假。

  8. 最后使用逻辑或 ||,由于前面的逻辑与结果为真,因此整个表达式的结果为真,result1

程序会输出 The value of result is 1

4. if 语句

if语句是最基本的选择结构,用于根据条件是否成立来执行不同的代码块。其基本形式如下:

if (condition) {// 当条件为真时执行的代码
} else {// 当条件为假时执行的代码
}
if 语句的多种变形
  • 简单 if 语句

    int num = 5;
    if (num > 0) {printf("Positive number\n");
    }

    如果num大于0,程序将输出Positive number

  • if-else 语句

    int score = 85;
    if (score >= 90) {printf("Excellent\n");
    } else {printf("Not excellent\n");
    }

    在这个例子中,如果score大于等于90,输出Excellent,否则输出Not excellent

  • if-else if-else 语句

    int score = 85;
    if (score >= 90) {printf("Excellent\n");
    } else if (score >= 60) {printf("Pass\n");
    } else {printf("Fail\n");
    }

    根据score的值,程序会输出相应的结果。

  • 嵌套 if 语句

    int a = 5, b = 10;
    if (a > 0) {if (b > a) {printf("b is greater than a, and a is positive\n");}
    }

    在这个例子中,if语句是嵌套的,只有当a > 0b > a时,程序才会输出结果。

5. switch 语句

switch语句通常用于多个可能值的情况选择,尤其是当你有很多if-else分支时,switch语句会使代码看起来更简洁。switch语句的基本结构如下:

switch (variable) {case value1:// 当 variable 等于 value1 时执行的代码break;case value2:// 当 variable 等于 value2 时执行的代码break;default:// 当没有匹配的值时执行的代码break;
}

详细分析

  • switch 语句中,variable必须是一个整数类型或字符类型。

  • 每个 case 分支后需要使用break语句来防止程序继续执行后续的case

  • default部分是可选的,用于处理所有不符合已定义情况的输入。

示例

char grade = 'B';
switch (grade) {case 'A':printf("Excellent\n");break;case 'B':printf("Good\n");break;case 'C':printf("Average\n");break;case 'D':printf("Below Average\n");break;case 'F':printf("Fail\n");break;default:printf("Invalid grade\n");break;
}

在这个例子中,程序会根据grade的值执行相应的分支。如果grade的值是B,程序将输出Gooddefault部分用于处理所有不符合已定义情况的输入。

6. 易错点总结

  • 条件运算符和逻辑运算符的混淆:要注意条件运算符(如><==等)与逻辑运算符(如&&||)的区别和使用场景。

  • 缺少break语句:在switch语句中,忘记写break会导致程序继续执行后续的case,即“贯穿效应”。

  • if语句中的赋值错误:在if条件中,使用=而不是==可能会导致逻辑错误。

    int a = 5;
    if (a = 10) {  // 错误:这里应该使用 ==printf("a is equal to 10\n");
    }

    这段代码会将a赋值为10,然后判断条件是否为真,容易导致意想不到的行为。

  • 逻辑运算的短路效应:当使用&&||时,要注意短路效应。例如,在a != 0 && b / a > 2中,如果a为0,第二个条件将不会被执行,这样可以避免除以零的错误。

小结

在C语言中,选择结构让程序具有更大的灵活性,使其能够根据不同的条件执行不同的操作。通过学习条件运算符、逻辑运算、if语句和switch语句,你可以编写出更加智能和复杂的程序。

相关文章:

C语言入门-选择结构

在编程中&#xff0c;我们经常需要根据不同的条件执行不同的操作。C语言为此提供了几种非常实用的选择结构&#xff1a;条件运算符、逻辑运算、if语句和switch语句。接下来&#xff0c;让我们深入探讨这些重要的知识点&#xff0c;帮助你更好地理解和掌握C语言的选择结构。 1.…...

Legion拯救者 刃7000K-26IAB联想台式机T5 26IAB7(90SU,90SV,90SW,90SX)原厂Windows11系统镜像下载

适用机型&#xff1a;【90SW、90SX、90SU、90SV】 链接&#xff1a;https://pan.baidu.com/s/1gJ4ZwWW2orlGYoPk37M-cg?pwd4mvv 提取码&#xff1a;4mvv lenovo联想原装WIN系统自带所有驱动、出厂主题专用壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软…...

代码随想录算法训练营第二十四天|Day24 回溯算法

93.复原IP地址 题目链接/文章讲解&#xff1a;https://programmercarl.com/0093.%E5%A4%8D%E5%8E%9FIP%E5%9C%B0%E5%9D%80.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1XP4y1U73i/ 思路 char** result; int resultTop; int segments[3]; int isValid(char* s…...

vue elementui table编辑表单时,弹框增加编辑明细数据

需求: 前端进行新增表单时&#xff0c;同时增加表单的明细数据。明细数据部分&#xff0c;通过弹框方式增加或者编辑。 效果图&#xff1a; 代码&#xff1a; <!-- 新增主表弹窗 Begin --><el-dialog:title"titleInfo"top"5vh"centerwidth"…...

springboot集成Redisson做分布式消息队列

这里演示Redisson做分布式消息队列。首先引入 Redisson依赖&#xff0c;官方github <dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>3.17.6</version> </dependen…...

如何通过Lua语言请求接口拿到数据

文章目录 概要http客户端通过请求下载数据 概要 当某个需求是需要在模块内请求接口拿到数据&#xff0c;需要使用http客户端调用接口 http客户端 LuaSOC请求接口官方文档 调用&#xff1a;http.request(method,url,headers,body,opts,ca_file,client_ca, client_key, clien…...

Android 13 SystemUI 隐藏下拉快捷面板部分模块(wifi,bt,nfc等)入口

frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java createTileInternal(tileSpec)方法注释想隐藏的模块即可。...

自由学习记录(14)

unity操作问题 位置&#xff1a;子物体的位置是相对于父物体的。如果你移动父物体&#xff0c;子物体会保持相对于父物体的相对位置&#xff0c;跟着一起移动。 旋转&#xff1a;子物体的旋转也是相对于父物体的。旋转父物体会导致子物体围绕父物体的原点旋转。 缩放&#xf…...

疯狂Spring Boot讲义[推荐1]

《疯狂Spring Boot讲义》是2021年电子工业出版社出版的图书&#xff0c;作者是李刚 《疯狂Spring Boot终极讲义》不是一本介绍类似于PathVariable、MatrixVariable、RequestBody、ResponseBody这些基础注解的图书&#xff0c;它是真正讲解Spring Boot的图书。Spring Boot的核心…...

vue中$nextTick的作用是什么,什么时候使用

$nextTick 是 Vue 提供的一个方法&#xff0c;用于在下一次 DOM 更新周期之后执行回调函数。它通常用于在 Vue 完成数据更新后&#xff0c;需要访问更新后的 DOM 状态时&#xff0c;保证操作的是更新后的 DOM。 工作原理&#xff1a; Vue 是异步更新 DOM 的&#xff0c;当数据…...

Redis实现全局ID生成器

全局ID生成器 为什么要用全局ID生成器 1.当我们使用数据库自增来实现id的生成时,规律过于明显,会给用户暴露很多信息 2.当我们订单量过大时无法用数据库的一张表来存放订单,如果两张表的id都是自增的话,id就会出现重复 什么是全局ID生成器 全局ID生成器,是一种在分布式系统…...

Xshell远程连接工具详解

Xshell是一款在Windows平台上运行的远程连接工具&#xff0c;它支持SSH1、SSH2以及Microsoft Windows平台的TELNET协议。Xshell通过互联网实现对远程主机的安全连接&#xff0c;帮助用户在复杂的网络环境中享受他们的工作。本文将详细介绍Xshell的溯源、最新版本以及它的优势。…...

如何在verilog设计的磁盘阵列控制器中实现不同RAID级别(如RAID 0、RAID 1等)的切换?

以下是一种在Verilog设计的磁盘阵列控制器中实现不同RAID级别(以RAID 0和RAID 1为例)切换的方法: 添加控制信号 在磁盘阵列控制器模块中添加一个输入信号,例如raid_mode,用于选择RAID模式。假设raid_mode = 0表示RAID 0模式,raid_mode = 1表示RAID 1模式。module raid_co…...

基于元神操作系统实现NTFS文件操作(十)

1. 背景 本文补充介绍文件遍历操作的部分附加内容&#xff0c;譬如&#xff0c;过滤掉系统元文件、过滤掉重复的文件项、过滤掉隐藏文件等&#xff0c;并提供了基于元神操作系统的部分实现代码。 2. 方法 &#xff08;1&#xff09;过滤掉系统元文件 NTFS文件系统的前16个元…...

Qt的几个函数方法

void receiveInfo1() {// 假设这是从串口接收到的字符串QString receivedString "23.5C,45%,1012hPa";// 使用逗号分隔符分割字符串QStringList parts receivedString.split(,);// 检查分割后的列表是否有足够的部分if (parts.size() > 3) {QString part1 part…...

openpnp - bug - 散料飞达至少定义2个物料

文章目录 openpnp - bug - 散料飞达至少定义2个物料笔记END openpnp - bug - 散料飞达至少定义2个物料 笔记 散料飞达上定义的物料个数用完了&#xff0c;现在只需要一个料就可以。 用顶部相机去找编带上是否还有一个单独的料&#xff0c;找到了。 定义散料飞达的料为1个&…...

HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException

HDFS异常org.apache.hadoop.hdfs.protocol.NSQuotaExceededException 异常信息&#xff1a; Hive:org.apache.hadoop.hdfs.protocol.NSQuotaExceededException: The NameSpace quota (directories and files) of directory /xxxdir is exceeded: quota10000 file count15001N…...

数据库的构成与手写简单数据库的探索

一、引言 在当今数字化的时代&#xff0c;数据库扮演着至关重要的角色。无论是企业管理系统、电子商务平台还是各种移动应用&#xff0c;都离不开数据库的支持。数据库是存储和管理数据的核心工具&#xff0c;它的高效性、可靠性和安全性对于数据的处理和应用至关重要。本文将…...

基于STM32的智能晾衣架设计

引言 随着智能家居的普及&#xff0c;智能晾衣架成为了提升生活便利性的重要设备。智能晾衣架通过集成多个传感器&#xff0c;能够自动感知天气变化、湿度、光照等环境因素&#xff0c;实现自动升降、风干和报警功能&#xff0c;帮助用户更加高效地晾晒衣物。本项目基于STM32设…...

【MAUI】模糊控件(毛玻璃高斯模糊亚克力模糊)

文章目录 XAML.CSToBytes方法使用效果 常试过AcrylicView.MAUI和Sharpnado.MaterialFrame&#xff0c;对于二者教程很少&#xff0c;使用直接写控件然后调属性&#xff0c;没有报错但也并没有效果所幸就自己写一个 XAML <?xml version"1.0" encoding"utf-…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...

GruntJS-前端自动化任务运行器从入门到实战

Grunt 完全指南&#xff1a;从入门到实战 一、Grunt 是什么&#xff1f; Grunt是一个基于 Node.js 的前端自动化任务运行器&#xff0c;主要用于自动化执行项目开发中重复性高的任务&#xff0c;例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...