C语言 运算符 (2)

一、内容概要

内容提neirong

关系运算符

逻辑运算符

逗号运算符

位运算

二、运算符

2.1 关系运算符

说明: >,<,>=,<=,==,!= (都是双目的)

  • 所有关系运算符都是双目运算符(二元运算符),运算符左侧和右侧、可以是变量、常量(字面量(是指直接在代码中写出的 “值本身)、符号常量、使用const 修饰的变量)、还可以是表达式、举例:
a > b; // 变量
5 > 6; // 常量
a+b>c; // 表达式
  • 关系运算符的结果是布尔类型、C语言中实际上没有布尔类型、我们用整型的 0 和 非 0 来表示成立(真)或者不成立(假)。
int a = 5, b = 4;
printf("%d,%d\n", a > b, a + b > 10);// 1,0 注意:计算机给我们返回的真-1,假-0
  • C99标准引入 stdbool.h ,本质上是对01进行了封装。其实很简单,就是定义了两个符号常量:
#define true 1
#define false 0

浮点型比较需要用插值法:fabs(a - b)< 1e -6。使用fabs取绝对值函数、需要引入math,h

在C语言中,为什么浮点型不用 == 符号做等判断?请看下面例子:

#include <stdio.h>int main(int argc,char *argv[])
{float a = 1.1f + 1.2f; // a 预测结果:2.3ffloat b = 2.3f; // b 预测结果:2.3fprintf("1.1f + 1.2f = %.20f\n",a); // %.20f 意思是保留小数点后20位printf(" 2.3f = %.20f\n",b);double a1 = 1.1 * 2;printf("%d\n",a1 == 2.2);return 0;
}

操作正确方式错误方式
浮点数相等比较使用误差范围(fabs(a - b) < epsilon)

epsilon:表示 “误差容忍度”(例如 1e-6 即 0.000001,1e-9 即 0.000000001);

a==b
浮点数大小比较直接使用 > 或 < (误差不影响顺序) -
零比较fabs(a) < epsilon a == 0.0

2.2 逻辑运算符

运算的结果为布尔值 、要么为 真-非0 ,要么为

(1)! 非(逻辑非)单目运算符,并且只能在操作数的左侧;非真即为假,非假即为真。(取反)
  • 对一个数或者表达式取非奇数次,结果与原值相反(如: !(a % 2 != 0) )是1次取非,结果: a%2==0
  • 对一个数或者表达式取非偶数次,结果与原值相同(如: !!(a % 2 == 0) )是2次取非,结果: a%2==0
(2)&& 与(逻辑与)双目运算符,当左右两侧的数据都为真时,最终的结果才为真(有假则为假
  • 当逻辑与运算时,左侧为假,右侧结果不会影响最终结果,右侧根本不会执行,最终的结果就是左侧的结果(假),这种现象称之为短路效果(短路与),这是C语言中提供的一种惰性计算,就是为了减少运算次数
// 需求:要求成绩在0~100以内
int score = 90;
printf("%d\n", score >= 0 && score <= 100); // 1
注意:
  • 避免链式调用(如: 0 <= score <= 100 ,应改为逻辑与: score >= 0 && score < = 100
  • C语言中,上面的链式写法并不会编译报错,为什么不能用链式调用?请看下面例 子:
int score1 = 45, score2 = -65, score3 = 110;
// 预测:0 <= 45 <= 100 结果为1
printf("%d\n",0 <= score1 <= 100);//实际结果:0 <= score1 返回1,1
<= 100返回1,最终结果1,成立
// 预测:0 <= -65 <= 100 结果为0
printf("%d\n",0 <= score2 <= 100);//实际结果:0 <= score2 返回0,0
<= 100返回1,最终结果1,不成立
// 预测:0 <= 110 <= 100 结果为0
printf("%d\n",0 <= score3 <= 100);//实际结果:0 <= score3 返回1,1
<= 100返回1,最终结果1,不成立
经过以上测试,我们发现链式比较语法上没问题,可以通过编译,但是逻辑上有问题,所以不能用作条件判断。
(3)|| 或(逻辑或)双目运算符,当左右测数据都为假时,最终的结果才为假(有真则为真
  • 当逻辑或运算时,左侧为真,右侧结果不会影响最终结果,右侧根本不会执行,最终的结果就是左侧的结果(真),这种现象称之为短路效果(短路或),这是C语言中提供的一种惰性计算,就是为了减少运算次数。
// 需求:闰年计算公式
int year = 2025;
printf("%d\n", ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0));

2.3 逗号运算符

作用: 将若干个表达式  “串联起来” 如:a = 4,a +=3;

别称:顺序求值运算符

2.3.1 逗号表达式

表达式 1,表达式 2,... 表达式n;

求解过程:按从左到右的顺序分别计算各个表达式的值,其中最后一个表达式 n 的值就是整个逗号表达式的值。

案例:

#include <stdio.h>
int main()
{int a = 0, b = 0; // 这不是逗号表达式,这里称作逗号分隔符。// 逗号表达式int result = (a = 3, b = 5, a + b);// 8 整体是赋值表达式,=右侧是逗号表达式// 怎么判断一个表达式是逗号表达式还是赋值表达式,要看它最终的运算是赋值操作还是逗号操作// 结合条件判断int x = 10, y = 20;int max = (x++, y++, (x > y) ? x : y);// x=10, y=20, max = 21printf("result=%d, max=%d\n", result, max);// result=8, max=21return 0;
}

2.4 位运算

说明: 按位(bit)来进行运算操作的运算符,更多时候用于定制化应用开发和嵌入式开发。

语法: ~、&、|、<<、>>

~:按位取反
说明:单目运算符,数据的每一个bit位按位取反,也就是二进制数据位上,01,10 演示:
                                

举例:

printf("%d\n",~5);

&:按位与

说明:双目运算符,对于运算符左右的两个数,对应的二进制位数据都为1时,结果为1、否则为0
演示:
                                  
举例:
printf("%d\n", 5 & 6); // 4
|: 按位或
说明:双目运算符,对于运算符左右的两个数据,对应的二进制位数据有一个为1,结果为1,否则为0
演示:
                                

举例:

printf("%d\n",5 | 6);// 7
^:按位异或
说明:双目运算符,对于运算符左右的两个数据,对应二进制位数据相同,结果为0,不同为1
演示:
                                

举例:

printf("%d\n",5 ^ 6);// 3

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

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

相关文章

mac版SVN客户端: macSvn 下载、使用指南【保姆级教程】

做项目要用SVN&#xff0c;在Mac平台找顺手的客户端好难。Windows下的TortoiseSVN很赞&#xff0c;Mac却一直没对等工具。直到发现新发布的MacSVN&#xff0c;布局和操作深得我心&#xff0c;内置常用工具&#xff0c;还能无缝集成到OS与任务栏&#xff0c;便捷易上手&#xff…

MongoDB分片集群自动化部署

OS&#xff1a;CentOS Linux release 7.9.2009 (Core) 场景&#xff1a; 需要半自动化或者自动化部署MongoDB集群时&#xff0c;可用此脚本。提高交付效率。 脚本实现架构图&#xff1a;脚本&#xff1a; check_clear_host.sh #此脚本有2个功能及是检查 资源规格和清理资源上的…

go-redis库使用总结

文章目录1. 概述与特性2. 安装与初始化2.1 安装2.2 初始化3 基本使用模式3.1 单实例客户端3.2 连接池与自动重连4. 常用 Redis 数据结构操作4.1 字符串&#xff08;String&#xff09;4.2 哈希&#xff08;Hash&#xff09;4.3 列表&#xff08;List&#xff09;4.4 集合&#…

【软件设计模式】策略模式

1.概念策略&#xff08;Strategy&#xff09;模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。策略模式属于行为型设计模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责…

Mac电脑英特尔版本最新系统15.6.1安装php环境

Mac电脑安装php环境 版本环境&#xff1a; 2025-08-22 14:09:19 安装 最新系统15.6.1系统&#xff1a; 新版本的mac不带php环境&#xff0c;需要自己 安装 brew install php8.3 启动说明 查看 . 使用官方方法安装 NVM curl -o- https://raw.githubusercontent.com/nvm-sh/…

Android焦点窗口变化导致遥控键值监听失效问题分析

最近在做语音全局控制Android系统功能&#xff0c;通过集成第三方语音识别sdk得到相关控制指令&#xff0c;然后将指令通过进程间通信传递给当前应用并作出响应。有很多通用指令&#xff0c;比如播放/暂停&#xff0c;Android系统本身就有全局控制指令&#xff1a;KeyEvent.KEY…

降本增效:基于 JavaScript 的 AI 编程 IDE 上下文压缩优化方案

降本增效&#xff1a;基于 JavaScript 的 AI 编程 IDE 上下文压缩优化方案 在当前 AI 辅助编程&#xff08;AI Pair Programming&#xff09;日益普及的背景下&#xff0c;开发者越来越依赖如 GitHub Copilot、Tabnine、CodeLlama 等智能编码工具。然而&#xff0c;一个普遍存在…

DataX HdfsWriter 插件文档

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;大数据、Java、测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/…

Rancher 管理的 K8S 集群中部署常见应用(MySQL、Redis、RabbitMQ)并支持扩缩容的操作

文章目录一、前提条件二、准备镜像三、进入 Rancher UI 部署3.1. 进入 Workloads3.2. 部署 MySQL3.3. 部署 Redis3.4. 部署 RabbitMQ四、验证服务五、扩缩容&#xff08;UI 操作&#xff09;六、附录yml部署文件6.1. mysql.yaml6.2. redis.yaml6.3. rabbitmq.yaml一、前提条件 …

8.21-8.22网络编程——词典

文章目录一、思维导图二、词典1、服务器2、客户端3、现象三、牛客网刷题一、思维导图 二、词典 1、服务器 #include <myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.116.128" //服务器IP地址 //账户密码结构 typedef s…

ffmpeg测试rtsp地址

ffmpeg可以用 ffmpeg 通过 tcp协议/udp协议传输流到 null设备&#xff0c;ffmpeg \-rtsp_transport tcp \ # 使用TCP协议传输RTSP流-timeout 5000000 \ # 设置超时时间为5000000微秒&#xff08;5秒&#xff09;-i "rtsp://admin:admin123192.168.1.…

Apache Commons Math_Java科学计算的利器

1. 引言 1.1 科学计算在现代软件开发中的重要性 随着大数据、人工智能和科学计算需求的不断增长,科学计算能力已成为现代软件开发不可或缺的重要组成部分。从金融风险评估到工程仿真,从数据分析到机器学习,科学计算在各行各业中发挥着关键作用。 科学计算涉及复杂的数学运…

Python爬虫框架设计:类封装与工程化实践​

实战中的UA轮换技巧 import fake_useragent import random class DynamicHeader: def init(self): self.ua_generator fake_useragent.UserAgent() # 注意&#xff1a;实际使用需更新数据路径 self.fingerprints [“chrome125”, “edge115”, “safari17”] # 2025年主流指…

5G 三卡图传终端:公安执法的 “移动可视化指挥中枢”

前言 在公安执法中&#xff0c;“实时取证、高效指挥、安全协同” 是破解现场复杂局面的核心需求。传统执法设备常因传输卡顿、证据存证难、跨警种信息断层等问题影响执法效能&#xff0c;而 5G 便携式多卡高清视频融合终端凭借多网聚合、高清编码、安全存储等特性&#xff0c;…

R语言rbind()和cbind()使用

rbind&#xff1a;r row&#xff08;行&#xff09;cbind&#xff1a;c column&#xff08;列&#xff09; 核心区别方向 • rbind&#xff1a;纵向&#xff08;按行&#xff09;堆叠&#xff0c;行数相加。 • cbind&#xff1a;横向&#xff08;按列&#xff09;拼接&#…

【Linux】开发工具命令指南:深度解析Vim的使用操作

欢迎各位佬进行交流&#xff0c;我们一起无限进步&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录Vim&#xff1a;多模式高效文本编辑器1. 初次体验 Vim2. Vim 核心工作模式&#xff08;…

【Day 12】73.矩阵置零

文章目录73.矩阵置零题目&#xff1a;思路&#xff1a;方法一&#xff1a;用两个标记数组&#xff08;易理解&#xff0c;额外空间 O(mn)&#xff09;思路&#xff08;直观&#xff09;举例&#xff08;[[1,1,1],[1,0,1],[1,1,1]]&#xff09;优缺点代码实现&#xff08;Go&…

Clustering Enabled Wireless Channel Modeling Using Big Data Algorithms

文章目录Clustering TechniquesPartitioning-Based AlgorithmsDensity-Based AlgorithmsHierarchical-based algorithmsClustering Enabled Channel ModelingCluster-Based Channel ModelsClustering AlgorithmsClustering Techniques 聚类是一种已被广泛用于数据分析的技术。…

基于「多模态大模型 + BGE向量检索增强RAG」的儿童绘画心理健康分析系统(vue+flask+AI算法)

一、项目演示视频 基于「多模态大模型 BGE向量检索增强RAG」的儿童绘画心理健康分析系统(vueflaskAI算法)二、技术栈 前端技术栈 (web-vue) 核心框架: Vue 3.5.13 (Composition API) UI组件库: Element Plus 2.9.4 状态管理: Pinia 2.3.1 路由管理: Vue Router 4.5.0 HTTP客户…

QML中的Component

目录 &#x1f9e0; 核心概念&#xff1a;什么是 Component&#xff1f; &#x1f4ca; Component 的两种主要形式 1. 内联 Component&#xff08;在 QML 文件内部定义&#xff09; 2. 外部 Component&#xff08;单独的 .qml 文件&#xff09; &#x1f3af; Component 的…