在C语言中,运算符根据操作数的数量分为单目运算符、双目运算符和三目运算符。它们的核心区别在于操作数的个数和用途:
1. 单目运算符(Unary Operators)
定义:只需要一个操作数的运算符。
常见运算符:
++(自增)、--(自减)
例如:a++(后缀自增)、++a(前缀自增)。+(正号)、-(负号)
例如:-5、+10。!(逻辑非)、~(按位取反)
例如:!flag(取反)、~0xFF(按位取反)。*(解引用)、&(取地址)
例如:*ptr(获取指针指向的值)、&var(获取变量地址)。sizeof(获取类型或变量大小)
例如:sizeof(int)。(类型)(强制类型转换)
例如:(float) a。
特点:
优先级高(仅次于括号和后缀运算符)。右结合性(如 *p++ 等价于 *(p++),而非 (*p)++)。
2. 双目运算符(Binary Operators)
定义:需要两个操作数的运算符。
常见运算符:
算术运算符:+、-、*、/、%
例如:a + b、5 % 3。关系运算符:<、>、<=、>=、==、!=
例如:a > b、x == y。逻辑运算符:&&(逻辑与)、||(逻辑或)
例如:a && b(两者为真时结果为真)。位运算符:&(按位与)、|(按位或)、^(异或)
例如:a & 0xFF(屏蔽高字节)。赋值运算符:=、+=、-=、*= 等
例如:a += 5(等价于 a = a + 5)。
特点:
左结合性(从左到右计算,如 a + b + c → (a + b) + c)。优先级差异大(如乘除高于加减)。
3. 三目运算符(Ternary Operator)
定义:需要三个操作数的运算符。唯一运算符:?:(条件运算符)。语法:
条件 ? 表达式1 : 表达式2
若条件为真,返回表达式1的值;否则返回表达式2的值。示例:int max = (a > b) ? a : b; // 取a和b中的较大值
特点:
右结合性(可嵌套,如 a ? b : c ? d : e → a ? b : (c ? d : e))。优先级最低(通常用括号明确逻辑)。
关键区别总结
类型操作数个数常见运算符优先级特点单目1++, --, !, *, &高优先级,右结合双目2+, &&, =, <<, ==优先级差异大三目3?:优先级最低
注意事项
结合性:
单目运算符通常是右结合(如 *p++ → *(p++))。双目运算符通常是左结合(如 a + b + c → (a + b) + c)。三目运算符是右结合。
易混淆点:
a + +b 是单目运算符(+b)和双目运算符(a + ...)的组合。a = b = c 是双目赋值运算符的右结合,等价于 a = (b = c)。
代码可读性:
即使优先级明确,也应多用括号明确逻辑,例如:(a & 0xFF) == 0。
理解这些分类能帮助你更清晰地分析复杂表达式,避免因优先级或结合性导致的逻辑错误!