一、算术运算符
用于基本的数学运算,操作数通常为整数(单片机多处理整型数据)。
| 运算符 | 功能 | 示例 | 说明 |
|---|---|---|---|
| + | 加法 | 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 += b → a = a + b |
| -= | 减后赋值 | a -= b → a = a - b |
| *= | 乘后赋值 | a *= b → a = a * b |
| /= | 除后赋值 | a /= b → a = a / b |
| %= | 取余后赋值 | a %= b → a = a % b |
| &= | 按位与后赋值 | a &= b → a = a & b |
| |= | 按位或后赋值 | `a |
| ^= | 按位异或后赋值 | a ^= b → a = a ^ b |
| <<= | 左移后赋值 | a <<= n → a = a << n |
| >>= | 右移后赋值 | a >>= n → a = 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=3、c=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的总字节数。
用途:动态计算数据长度(如数组遍历、内存分配),提高代码可移植性。
总结
- 位运算符是单片机编程的核心(直接操作寄存器、IO口),需重点掌握。
- 算术/赋值运算符用于数据计算和变量更新,注意溢出问题。
- 逻辑/关系运算符用于条件判断(如if、while语句)。
- 指针和sizeof在内存操作、外设访问中频繁使用,是底层编程的基础。
根据具体单片机型号(如8051、STM32等),部分运算符的行为可能因数据类型长度(如int的位数)略有差异,需结合手册调整。