C语言中的运算符

一、算术运算符

用于基本的数学运算,操作数通常为整数(单片机多处理整型数据)。

运算符 功能 示例 说明
+ 加法 a + b 两数相加
- 减法 a - b 两数相减
* 乘法 a * b 两数相乘(注意溢出风险)
/ 除法 a / b 整数除法,结果取整数部分
% 取余(模运算) a % b 求a除以b的余数,b不能为0
++ 自增 a++++a 等价于a = a + 1,前者先使用后加1,后者先加1后使用
-- 自减 a----a 等价于a = a - 1,用法同自增

注意:单片机多为8位/16位处理器,运算时需注意数据范围,避免溢出(如8位无符号数最大为255,超出则溢出)。

二、赋值运算符

用于给变量赋值,可结合其他运算符简化代码。

运算符 功能 等价写法
= 基本赋值 a = b
+= 加后赋值 a += ba = a + b
-= 减后赋值 a -= ba = a - b
*= 乘后赋值 a *= ba = a * b
/= 除后赋值 a /= ba = a / b
%= 取余后赋值 a %= ba = a % b
&= 按位与后赋值 a &= ba = a & b
|= 按位或后赋值 `a
^= 按位异或后赋值 a ^= ba = a ^ b
<<= 左移后赋值 a <<= na = a << n
>>= 右移后赋值 a >>= na = a >> n

示例a += 5 等价于 a = a + 5,在单片机编程中可简化代码,提高效率。

三、关系运算符

用于比较两个值的关系,返回结果为0(假)非0(真,通常为1)

运算符 功能 示例
== 等于 a == b
!= 不等于 a != b
> 大于 a > b
< 小于 a < b
>= 大于等于 a >= b
<= 小于等于 a <= b

注意 :不要混淆赋值运算符=和关系运算符==,前者用于赋值,后者用于比较。

四、逻辑运算符

用于逻辑判断,操作数为"真"(非0)或"假"(0),结果为0或1。

运算符 功能 示例 说明
&& 逻辑与(AND) a && b 两者都为真时结果为真,否则为假
|| 逻辑或(OR) `a
! 逻辑非(NOT) !a 取反,真变假,假变真

短路特性

  • &&:若左侧为假,则右侧不再执行(结果已确定为假)。
  • ||:若左侧为真,则右侧不再执行(结果已确定为真)。

示例if (a > 0 && b < 10) 中,若a <= 0,则不会判断b < 10

五、位运算符

单片机中高频使用,直接操作二进制位(寄存器控制、IO口操作等核心场景)。

运算符 功能 示例 说明
& 按位与 a & b 对应位都为1则结果为1,否则为0
| 按位或 `a b`
^ 按位异或 a ^ b 对应位不同则结果为1,相同则为0
~ 按位取反 ~a 0变1,1变0(单目运算符)
<< 左移 a << n 二进制位左移n位,右侧补0
>> 右移 a >> n 二进制位右移n位,左侧补符号位(有符号数)或0(无符号数)

应用场景

  • 置位:P1 |= 0x01(将P1口的第0位置为1,其他位不变)。
  • 清零:P1 &= ~0x01(将P1口的第0位清为0,其他位不变)。
  • 取位:bit = (P1 & 0x01) >> 0(读取P1口第0位的值)。

六、条件运算符(三目运算符)

格式:表达式1 ? 表达式2 : 表达式3

功能:若表达式1为真(非0),则结果为表达式2的值;否则为表达式3的值。

示例:max = (a > b) ? a : b(取a和b中的最大值)
优势:简化简单的条件判断,适合单片机中紧凑代码的编写。

七、逗号运算符

格式:表达式1, 表达式2, ..., 表达式n

功能:从左到右依次执行所有表达式,最终结果为最后一个表达式的值。

示例:a = (b=3, c=5, b+c) → 先执行b=3c=5,再计算b+c=8,最终a=8
用途:在一行代码中执行多个表达式(如for循环的初始化)。

八、指针运算符

单片机中用于访问内存地址(如外设寄存器地址、缓冲区等)。

运算符 功能 示例
* 指针取值(间接访问) *p
& 取地址 &a

示例
uint8_t *p; // 定义一个指向8位无符号数的指针
p = &data; // 指针p指向变量data的地址
*p = 0x55; // 给指针p指向的地址赋值0x55(即给data赋值)

九、 sizeof 运算符

格式:sizeof(操作数)

功能:计算操作数的字节大小(返回无符号整数)。

示例:
sizeof(int) → 若单片机int为2字节,则返回2;
sizeof(arr) → 计算数组arr的总字节数。
用途:动态计算数据长度(如数组遍历、内存分配),提高代码可移植性。

总结

  1. 位运算符是单片机编程的核心(直接操作寄存器、IO口),需重点掌握。
  2. 算术/赋值运算符用于数据计算和变量更新,注意溢出问题。
  3. 逻辑/关系运算符用于条件判断(如if、while语句)。
  4. 指针和sizeof在内存操作、外设访问中频繁使用,是底层编程的基础。

根据具体单片机型号(如8051、STM32等),部分运算符的行为可能因数据类型长度(如int的位数)略有差异,需结合手册调整。

相关推荐
素玥8 分钟前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian15 分钟前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室33 分钟前
审计策略修改
网络·数据库·瀚高数据库
言慢行善1 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅1 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师1 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
迷枫7122 小时前
达梦数据库的体系架构
数据库·oracle·架构
夜晚打字声2 小时前
9(九)Jmeter如何连接数据库
数据库·jmeter·oracle
LCMICRO-133108477462 小时前
国产长芯微LDC5141完全P2P替代DAC80501,数模转换器 (DAC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·数模转换器 dac
Chasing__Dreams2 小时前
Mysql--基础知识点--95--为什么避免使用长事务
数据库·mysql