一、算术运算符
用于基本的数学运算,操作数通常为整数(单片机多处理整型数据)。
运算符 | 功能 | 示例 | 说明 |
---|---|---|---|
+ | 加法 | 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的位数)略有差异,需结合手册调整。