三、C语言中的分支与循环—条件操作符 与逻辑操作符(3)

本章分支结构的学习内容如下:

三、C语言中的分支与循环—if语句 (1)

三、C语言中的分支与循环—关系操作符 (2)

三、C语言中的分支与循环—条件操作符 与逻辑操作符(3)

三、C语言中的分支与循环—switch语句(4)分支结构 完


本章循环结构的学习内容如下:

三、C语言中的分支与循环—while循环 (5)

三、C语言中的分支与循环—for循环 (6)

三、C语言中的分支与循环—do-while循环 (7)

三、C语言中的分支与循环—break和continue语句(8)循环结构 完  


1.条件操作符(三目操作符)

condition ? expression1 : expression2

这里,condition 是一个布尔表达式,即它的结果为真(非零)或假(零)。如果 condition 为真,则整个条件操作符的结果是 expression1 的值;如果为假,则结果是 expression2 的值。这个操作符通常用于需要简单条件判断的地方,可以使代码更加简洁。

1)代码练习:使用条件表达式实现找两个数中较大值

在这个例子中,条件操作符用于比较两个整数 ab。如果 a > b 为真,则 max 被赋值为 a 的值;否则,max 被赋值为 b 的值。这种方式比使用传统的 if-else 语句更加简洁。

#include <stdio.h>int main() {int a = 10, b = 20;// 使用条件操作符决定哪个数较大int max = (a > b) ? a : b;printf("较大的数是:%d\n", max);return 0;
}

2.逻辑操作符(&& , || , !)

1)`&&` (逻辑与)

 当且仅当两个操作数都为真(非零)时,结果为真。如果第一个操作数为假(零),则不再检查第二个操作数(短路行为)。不同操作数的结果如下:

2)`||` (逻辑或)

如果至少一个操作数为真,则结果为真。如果第一个操作数为真,第二个操作数不会被检查(短路行为)。

3) `!` (逻辑非)

如果操作数为假(零),结果为真(1),反之亦然。

4)代码练习1

在这个例子中:
- `a > 0 && b > 0` 检查 `a` 和 `b` 是否都大于 0。
- `a > 0 || c > 0` 检查 `a` 或 `c` 至少有一个大于 0。
- `!c` 检查 `c` 是否等于 0(因为 `c` 为 0,`!c` 的结果为真)。

#include <stdio.h>int main() {int a = 5, b = 10, c = 0;// 逻辑与 (&&)if (a > 0 && b > 0) {printf("a 和 b 都大于 0\n");} else {printf("a 和 b 不都大于 0\n");}// 逻辑或 (||)if (a > 0 || c > 0) {printf("a 或 c 至少有一个大于 0\n");} else {printf("a 和 c 都不大于 0\n");}// 逻辑非 (!)if (!c) {printf("c 等于 0\n");} else {printf("c 不等于 0\n");}return 0;
}

5)代码练习2:闰年的判断

输入⼀个年份year,判断year是否是闰年
闰年判断的规则:
1. 能被4整除并且不能被100整除是闰年
2. 能被400整除是闰年
我们观察这个逻辑,发现1和2只要有一个满足就可是闰年,1和2之间是或的关系,我们可以写成
if (1||2)printf("%d年时闰年",year);

在1的内部有一个与关系,能被4整除并且不能被100整除是闰年,我们可以写成

能被4整除&&不能被100整除

最后结合起来判断闰年的条件是:

if((能被4整除&&不能被100整除)||(能被400整除是闰年))

最终我们的代码如下:

#include <stdio.h>
//闰年判断的规则:
//能被4整除并且不能被100整除是闰年
//能被400整除是闰年
int main()
{int year = 0;scanf("%d", &year);if ((year % 4 == 0 && year % 100 != 0)|| (year % 400 == 0))printf("%d年是闰年",year);else printf("%d年不是闰年", year);return 0;
}

3.短路现象

C语言中的短路现象(Short-circuit Evaluation)指的是在使用逻辑操作符 &&(逻辑与)和 ||(逻辑或)时的一种特殊行为。当确定整个逻辑表达式的值无需完全评估所有部分时,某些部分的评估就会被跳过。这种行为可以提高效率,也可以用于条件判断中的某些特殊用途。

1)短路现象详解:

  1. 逻辑与 (&&) 的短路现象: 如果 && 操作符的左侧表达式评估为假(0),则整个表达式的结果必定为假,因此没有必要评估右侧的表达式。例如,在表达式 A && B 中,如果 A 是假,不论 B 的值如何,整个表达式的结果都是假。

  2. 逻辑或 (||) 的短路现象: 如果 || 操作符的左侧表达式评估为真(非0),则整个表达式的结果必定为真,因此不需要再评估右侧的表达式。例如,在表达式 A || B 中,如果 A 是真,不论 B 的值如何,整个表达式的结果都是真

2)代码练习

在这个例子中:在main函数外面定义了两个不同的函数,方便调用test1() 和test2(),test1() 和test2()分别有各自的打印任务,如果执行test1() 和test2(),则相应的内容会被打印。

  • test1() && test2() 表达式中,因为 test1() 返回假(0),所以不会执行 test2(),只执行了test1(),所以"执行了 test1"这句话被打印
  • test2() || test1() 表达式中,因为 test2() 返回真(非0),所以不会执行 test1(),只执行了 test2() ,所以"执行了 test2"这句话被打印

短路现象在实际编程中非常有用,特别是当右侧表达式依赖于左侧表达式的结果时。例如,避免除以0的错误或在访问数组或指针之前先检查它们是否为 NULL

#include <stdio.h>int test1() {printf("执行了 test1\n");return 0;  // 返回假(0)
}int test2() {printf("执行了 test2\n");return 1;  // 返回真(非0)
}int main() {printf("测试逻辑与 (&&) 的短路现象:\n");if (test1() && test2()) {  // 因为 test1 返回假,所以 test2 不会执行printf("两者都为真\n");} else {printf("至少有一个为假\n");}printf("\n测试逻辑或 (||) 的短路现象:\n");if (test2() || test1()) {  // 因为 test2 返回真,所以 test1 不会执行printf("至少有一个为真\n");} else {printf("两者都为假\n");}return 0;
}

4.知识点结合的代码练习

如果AB值都为非零则输出在一起,否则做朋友
#include <stdio.h>
int main()
{int A = 0;int B = 0;scanf("%d%d", &A, &B);(A && B) ? (printf("A和B在一起")) : (printf("A和B做朋友"));return 0;
}

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

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

相关文章

【模拟电路】模拟集成电路之神-NE555

一、集成电路NE555简介 二、功能框图与引脚说明 三、比较器&#xff08;运放&#xff09; 四、反相门&#xff08;非门&#xff09; 五、或非门 六、双稳态触发器 七、NE555的工作原理 集成电路NE555的芯片手册 C5157696 一、集成电路NE555简介 NE555起源于上个世纪70年代&a…

【C语言】Linux socket 编程

一、Socket 通信过程 在 Linux 系统中&#xff0c;socket 是一种特殊的文件描述符&#xff0c;用于在网络中的不同主机间或者同一台主机中的不同进程间进行双向通信。它是通信链路的端点&#xff0c;可以看作是网络通信的接口。Socket 通信过程主要分为以下几个步骤&#xff1a…

go语言``反引号用法归纳——多行输出和Tag标签(指定json名称、MySQL名称))

一、多行输出 示例 func main() {str1 : 反引号多行字符串str2 : "双引号" " 多行" " 字符串"//str3 : 单引号" //" 多行" //" 字符串str4 : "双引号\n" " 多行\n" &quo…

【SpringBoot3】命令行运行jar包报错可能的一些原因

端口号冲突&#xff1a; 有其他的web程序在运行&#xff0c;占用了8080端口没有主清单属性&#xff1a; 在打包jar包前&#xff0c;没有加入打包的插件spring-boot-maven-plugin&#xff0c;参考1.SpringBoot入门的第一个完整小项目&#xff08;新手保姆版教会打包&#xff09;…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)在EventLoop中处理被激活的文件描述符的事件

文件描述符处理与回调函数 一、主要概念 反应堆模型&#xff1a;一种处理系统事件或网络事件的模型&#xff0c;当文件描述符被激活时&#xff0c;可以检测到文件描述符&#xff1a;在操作系统中&#xff0c;用于标识打开的文件、套接字等的一种数据类型 处理激活的文件描述符…

太阳能防外破智能地钉_灯光警示_定位-深圳鼎信

智能地钉是一种利用无线传感和无线通信技术来保护地下管道线路&#xff0c;防止地面施工或其它因素导致管道外破的装置。组成结构包括智能分析模块、陀螺仪传感器、无线模块、备用电池、太阳能板、金属防护外壳、北斗定位以及声光报警器等。 智能地钉镶嵌在地面上具有防水、耐腐…

算法——队列+宽搜(BFS)

队列这种数据结构大都服务于一个算法——宽搜&#xff08;BFS&#xff09;。宽搜还可以运用到二叉树、图、迷宫最短路径问题、拓扑排序等等 N叉数的层序遍历 N叉树的层序遍历 题目解析 给定一个 N 叉树&#xff0c;返回其节点值的_层序遍历_。&#xff08;即从左到右&#…

【python】—— 列表和元组详解

Python是一种强大的编程语言&#xff0c;它提供了许多内置的数据结构&#xff0c;用于存储和处理数据。其中&#xff0c;列表和元组是两种常用的数据类型。这篇文章将介绍这两种数据结构的定义、用途、用法以及它们的异同点。 目录 &#xff08;一&#xff09;理解列表和元组 …

面试题理解深层次的数组名

目录 引言 一&#xff1a;一维数组 举例如下 1.铺垫知识 数组名是数组首元素的地址&#xff0c;但是有两个特殊情况 &#xff08;1&#xff09;sizeof(数组名) &#xff08;2&#xff09;&数组名 2.分析讲解上述代码结果 2.字符数组 举例一如下 1.知识铺垫 …

软性演员-评论家算法 SAC

软性演员-评论家算法 SAC 软性演员-评论家算法 SAC优势原理软性选择模型结构目标函数重参数化熵正则化代码实现 软性演员-评论家算法 SAC 优势原理 DDPG 的问题在于&#xff0c;训练不稳定、收敛差、依赖超参数、不适应复杂环境。 软性演员-评论家算法 SAC&#xff0c;更稳定…

23款奔驰GLC260L升级香氛负离子 车载香薰

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。星骏汇小许Xjh15863 产品功能&…

23款奔驰GLC260L升级原厂540全景影像 高清环绕的视野

嗨 今天给大家介绍一台奔驰GLC260L升级原厂360全景影像 新款GLC升级原厂360全景影像 也只需要安装前面 左右三个摄像头 后面的那个还是正常用的&#xff0c;不过不一样的是 升级完成之后会有多了个功能 那就是新款透明底盘&#xff0c;星骏汇小许Xjh15863 左右两边只需要更换后…