C语言操作符

🌟 各位看官好,我是maomi_9526

🌍 种一棵树最好是十年前,其次是现在!

🚀 今天来学习C语言的相关知识。

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦

目录

1. 操作符的分类

2. 操作符的优先级和结合性

优先级:

结合性:

操作符优先级示例:

3. 左移操作符(<<)

4. 按位与操作符(&)

5. 按位异或操作符(^)

6. 使用按位异或交换两个变量的值

7. 整型提升与算术转换

整型提升示例

算术转换


1. 操作符的分类

我们首先将操作符分类,并通过表格详细说明每种类型的操作符。操作符在C语言中非常重要,它们帮助我们完成各种计算任务,包括数学计算、逻辑判断、位运算等。

类别操作符说明
算术操作符+, -, *, /, %用于执行常见的数学运算,如加法、减法、乘法、除法和取余。
移位操作符<<, >>用于将二进制位进行左移或右移。右移时有逻辑右移和算术右移的区别。
位操作符&, `, ^, ~`
赋值操作符=, +=, -=, *=, /=, %=用于给变量赋值,支持复合赋值操作(如+=,-=等)。
单目操作符!, ++, --, &, *, +, -, ~, sizeof, (type)只有一个操作数。用于逻辑非、自增、自减、地址获取、类型转换等。
关系操作符>, >=, <, <=, ==, !=用于比较两个值的大小或是否相等。
逻辑操作符&&, `
条件操作符?:三目运算符,用于简化条件判断的表达式。
逗号操作符,逗号分隔多个子表达式,按顺序执行每个表达式,并返回最后一个表达式的值。
下标访问[]用于访问数组元素。
函数调用()用于调用函数,并传递参数。
结构成员访问., ->用于访问结构体的成员。

2. 操作符的优先级和结合性

优先级

优先级决定了在同一个表达式中,多个运算符的执行顺序。例如,在表达式中同时出现+*时,乘法(*)的优先级高于加法(+),因此*会先执行。

结合性

结合性决定了同一优先级的运算符的执行顺序。大部分运算符是左结合的(即从左到右执行),少数是右结合的(如赋值操作符=)。对于右结合的运算符,操作数会从右向左进行运算。

操作符类型结合性
左结合操作符大多数运算符,如 +, -, *, &&, `
右结合操作符=, ?:
操作符优先级示例
#include <stdio.h>int main() {int a = 3;int b = 4;int c = 5;int result = a + b * c;  // 乘法优先级高于加法printf("result = %d\n", result);  // 输出: result = 23 (4 * 5 = 20, 3 + 20 = 23)return 0;
}

解释

  • a + b * c中,乘法操作b * c的优先级高于加法操作a + b,因此先计算b * c = 20,然后再进行加法运算3 + 20 = 23

3. 左移操作符(<<)

左移操作符将二进制数向左移动,右侧填充0。左移操作通常会导致数值乘以2的倍数(每左移一位,数值乘以2)。

#include <stdio.h>int main() {int num = 10;  // 二进制:1010int n = num << 1;  // 左移1位printf("n = %d\n", n);  // 输出: n = 20 (二进制:10100)printf("num = %d\n", num);  // 输出: num = 10return 0;
}

解释

  • num的二进制表示是1010(即10)。当执行num << 1时,num的所有位向左移动一位,右侧补充0,变成10100(即20)。
  • 左移1位等于将原值乘以2,因此10 << 1的结果是20

4. 按位与操作符(&)

按位与操作符&逐位比较两个整数的对应位,只有当两位都为1时,结果才为1,否则为0

#include <stdio.h>int main() {int num1 = -3;  // 二进制:11111111111111111111111111111101(补码)int num2 = 5;   // 二进制:00000000000000000000000000000101printf("%d\n", num1 & num2);  // 输出:5return 0;
}

解释

  • -3的二进制补码为111111111111111111111111111111015的二进制为00000000000000000000000000000101
  • 按位与操作符会逐位比较这两个二进制数,当两个位都为1时,结果为1。因此,只有第三和第四位是1,结果为5

5. 按位异或操作符(^)

按位异或操作符^逐位比较两个数的对应位,只有当两个位不相同时,结果才为1

#include <stdio.h>int main() {int num1 = 6;  // 二进制:00000000000000000000000000000110int num2 = 5;  // 二进制:00000000000000000000000000000101printf("%d\n", num1 ^ num2);  // 输出:3 (二进制:00000000000000000000000000000011)return 0;
}

解释

  • 6的二进制表示为000000000000000000000000000001105的二进制为00000000000000000000000000000101
  • 按位异或操作符会逐位比较这两个数的二进制表示,当对应位不相同时,结果为1。因此,结果是3

6. 使用按位异或交换两个变量的值

这种技巧常用于不使用临时变量交换两个数的值。

#include <stdio.h>int main() {int a = 10, b = 20;a = a ^ b;  // a = 10 ^ 20b = a ^ b;  // b = (10 ^ 20) ^ 20a = a ^ b;  // a = (10 ^ 20) ^ 10printf("a = %d, b = %d\n", a, b);  // 输出: a = 20, b = 10return 0;
}

解释

  • 使用^(异或操作符),通过一系列的异或操作,我们可以交换两个数的值。第一步是a = a ^ b,接着通过再次异或将原本的ab值互换。
  • 这个技巧避免了使用临时变量。

7. 整型提升与算术转换

C语言中的整型提升是指小类型(如charshort)会在进行算术运算时被自动转换为int类型。

整型提升示例
#include <stdio.h>int main() {char a = 5;short b = 10;int result = a + b;  // a 和 b 会提升为 int 类型进行加法printf("result = %d\n", result);  // 输出: result = 15return 0;
}

解释

  • a + b中,achar类型,bshort类型。它们都被自动提升为int类型,因此加法操作是在int类型下进行的。
算术转换

当表达式中的操作数类型不同,C语言会根据某些规则进行类型转换。

#include <stdio.h>int main() {float a = 3.14;int b = 2;float result = a + b;  // b 会被转换为 float 类型printf("result = %.2f\n", result);  // 输出: result = 5.14return 0;
}

解释

  • a + b中,afloat类型,bint类型。b会被自动转换为float类型,这样加法操作就会在float类型下进行。

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

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

相关文章

PostgreSQL:语言基础与数据库操作

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

KMP算法

KMP算法 为什么叫做KMP呢。 因为是由这三位学者发明的&#xff1a;Knuth&#xff0c;Morris和Pratt&#xff0c;所以取了三位学者名字的首字母。所以叫做KMP next数组就是一个前缀表&#xff08;prefix table&#xff09;。 前缀表是用来回退的&#xff0c;它记录了模式串与…

3D点云数据处理中的聚类算法总结

1.欧式聚类&#xff1a; 基于点的空间距离&#xff08;欧几里得距离&#xff09;来分割点云&#xff0c;将距离较近的点归为同一簇。 欧式聚类需要的参数&#xff1a;邻域半径R,簇的最小点阈值minPts&#xff0c;最大点数阈值maxPts。 实现效率&#xff1a; O(n * log n) 实现…

WRC世界机器人大会-2024年展商汇总

2024世界机器人大会 时间&#xff1a;2024年8月21日至25日 地点&#xff1a;北京经济技术开发区北人亦创国际会展中心 大会主题&#xff1a;共育新质生产力&#xff0c;共享智能新未来 2024世界机器人博览会亮点纷呈&#xff0c;20余款人形机器人整机将亮相博览会&#xff…

拉取镜像,推送到阿里云镜像仓库

需求背景&#xff1a;在学习k8s&#xff0c;虚拟机无法正常拉取 wangyanglinux/tools:busybox 镜像。 解决办法&#xff1a;将墙外镜像拉到国内&#xff08;阿里云&#xff09;再使用 准备工作需要创建对应的镜像仓库&#xff0c;然后再进行推送 1. 拉取镜像 docker pull …

DeepSeek和Kimi在Neo4j中的表现

以下是2个最近爆火的人工智能工具&#xff0c; DeepSeek:DeepSeek Kimi: Kimi - 会推理解析&#xff0c;能深度思考的AI助手 1、提示词&#xff1a; 你能帮我生成一个知识图谱吗&#xff0c;等一下我会给你一篇文章&#xff0c;帮我从内容中提取关键要素&#xff0c;然后以N…

哈尔滨工业大学DeepSeek公开课人工智能:大模型原理 技术与应用-从GPT到DeepSeek|附视频下载方法

导 读INTRODUCTION 今天继续哈尔滨工业大学车万翔教授带来了一场主题为“DeepSeek 技术前沿与应用”的报告。 本报告深入探讨了大语言模型在自然语言处理&#xff08;NLP&#xff09;领域的核心地位及其发展历程&#xff0c;从基础概念出发&#xff0c;延伸至语言模型在机器翻…

redis解决缓存穿透/击穿/雪崩

文章目录 1.缓存穿透1.1 概念1.2 解决方案1.2.1 缓存空对象1.2.2 布隆过滤 1.2 店铺查询使用缓存穿透解决方案1.2.1 流程 2.缓存雪崩2.1 什么是缓存雪崩&#xff1f;2.2 雪崩解决方案 3.缓存击穿3.1 什么是缓存击穿&#xff1f;3.2解决方案3.2.1 基于互斥锁解决缓存击穿问题&am…

不连续平面提取

不连续平面提取 提取流程 #mermaid-svg-Y87uP8WsVRmPYriG {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Y87uP8WsVRmPYriG .error-icon{fill:#552222;}#mermaid-svg-Y87uP8WsVRmPYriG .error-text{fill:#552222;s…

大语言模型-2.2/3-主流模型架构与新型架构

简介 本博客内容是《大语言模型》一书的读书笔记&#xff0c;该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品&#xff0c;覆盖大语言模型训练与使用的全流程&#xff0c;从预训练到微调与对齐&#xff0c;从使用技术到评测应用&#xff0c;帮助学员全面掌握大语言模型的…

数据库操作练习

一.向heros表中新增一列信息&#xff0c;添加一些约束&#xff0c;并尝试查询一些信息 //向表中添加一列age信息 alter table heros add column age int;//id列添加主键约束&#xff0c;设置自增 alter table heros modify column id int auto_increment primary key;//name列…

CTF【WEB】学习笔记1号刊

Kali的小工具箱 curl www.xxx.com&#xff1a;查看服务器响应返回的信息 curl -I www.xxx.com:查看响应的文件头 一、cmd执行命令 ipconfig&#xff1a;ip地址配置等&#xff1b; 二、 Kali操作 1.sudo su&#xff1b; 2.msfconsole 3.search ms17_010 永恒之蓝&#xff…

在 SaaS 应用上构建 BI 能力的实战之路

SaaS 产品在持续运营过程中积累了大量数据&#xff0c;这些数据不仅是数字的记录&#xff0c;更是洞察市场趋势、优化产品功能、提升用户体验的宝贵资源。 因此&#xff0c;大部分的 SaaS 产品在发展到一定阶段后&#xff0c;都会开始构建自己的报表模块或分析模块&#xff0c;…

gonet开源游戏服务器环境配置

1.mysql搭建 搜索mysql-server apt安装包名 sudo apt search mysql-server 安装mysql-server sudo apt-get install mysql-server 安装完成后会&#xff0c;启动mysql服务及创建系统服务 查看服务状态 systemctl status mysql.service 使用超级权限登陆mysql sudo mysql 授…

STM32基础篇(五)------TIM定时器比较输出

简介 定时器的类型 在《STM32F10xxx参考手册&#xff08;中文&#xff09;.pdf》中可以看到下面三个章节 因此可以得到 高级定时器含有通用定时器的所有功能&#xff0c;通用定时器含有基本定时器的所有功能&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

基于STM32的两路电压测量仿真设计Proteus仿真+程序设计+设计报告+讲解视频

基于STM32两路电压测量仿真设计(Proteus仿真程序设计设计报告讲解视频&#xff09; 仿真图Proteus 8.9 程序编译器&#xff1a;keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;C0106 1.主要功能 基于STM32单片机设计一个双路电压检测器 1.系统可以测量两路输入电…

210、【图论】课程表(Python)

题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系&#xff0c;找到入度为0的点作为起始遍历点。之后每遍历到这个点之后&#xff0c;就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时&#xff0c;继续被加入其…

react 杂记2 优化hook

useEffect 每个Fiber节点都会为该组件的所有effec对象​维护一个链表, 场景​类组件方法函数组件等效写法差异说明挂载时执行componentDidMount()useEffect(fn, [])useEffect 副作用在浏览器绘制后异步执行&#xff1b;componentDidMount 是同步的。更新时执行componentDidUp…

Java内存泄漏、CPU飙升排查

在Java应用开发中&#xff0c;内存泄漏和CPU飙升是两类高频出现的生产问题&#xff0c;也是常见的面试问题。这里通过一些demo进行实践。 内存泄漏 private static List<byte[]> leakList new ArrayList<>();GetMapping("/memory/leak") public void …

【搜索】dfs(回溯、剪枝、记忆化)

个人主页&#xff1a;Guiat 归属专栏&#xff1a;我讲你听 文章目录 1. dfs 回溯1.1 回溯介绍1.2 回溯模板1.3 回溯经典题目 2. dfs 剪枝2.1 剪枝介绍2. 2 剪枝模板2.3 经典题目 3. dfs 记忆化3.1 记忆化介绍3.2 记忆化示例 正文 1. dfs 回溯 1.1 回溯介绍 核心思想&#xff…