文章目录
- C语言【完整版】运算符优先级+结合性 总表(最全无遗漏)
- ✅ 完整版:C语言所有运算符优先级+结合性总表(按优先级从高到低排序)
- ✅ 【必背】高频核心优先级口诀(不用死记全表,记住这个足够开发+笔试)
- 口诀解释(对应优先级):
- ✅ 【高频易错点】5个最容易踩坑的优先级/结合性规则(90%的C语言学习者都会错)
- 易错点1:赋值运算符是「右结合」
- 易错点2:sizeof 是「运算符」不是函数
- 易错点3:自增/自减的「前置vs后置」优先级相同,执行时机不同
- 易错点4:逻辑与 `&&` 优先级 > 逻辑或 `||`
- 易错点5:位运算 vs 逻辑运算 优先级区分
- ✅ 【实用技巧】记不住优先级?2个万能法则(永远不会错)
- 总结
核心优先级关系:()> 单目 > 算术 > 关系 > 相等 > 位运算 > 逻辑运算 > 三目 > 赋值 > 逗号;C语言【完整版】运算符优先级+结合性 总表(最全无遗漏)
✅ 核心规则(重中之重,必须记住):
- C语言运算符优先级分为1~15级,数字越小,优先级越高(1级最高,15级最低),优先级越高的运算符越先执行;
- 同级别的运算符,执行顺序由「结合性」决定:
- ✔️左结合:从左到右依次计算(绝大多数运算符是左结合);
- ✔️右结合:从右到左依次计算(少量特殊运算符,是高频易错点);
- 小括号
()是优先级最高的运算符,任何时候想强制改变运算顺序,用()包裹即可,永远不会出错。
核心优先级关系:()> 单目 > 算术 > 关系 > 相等 > 位运算 > 逻辑运算 > 三目 > 赋值 > 逗号;
✅ 完整版:C语言所有运算符优先级+结合性总表(按优先级从高到低排序)
| 优先级 | 运算符 | 结合性 | 运算符名称/含义说明 | 举例 |
|---|---|---|---|---|
| 1(最高) | () | 左结合 | 圆括号(表达式分组) | (a+b)*c、func(a) |
[] | 左结合 | 数组下标访问 | arr[5] | |
-> | 左结合 | 结构体/联合体指针成员访问 | p->name | |
. | 左结合 | 结构体/联合体普通变量成员访问 | stu.age | |
| 2 | ! | 右结合 | 逻辑非运算符 | !flag |
~ | 右结合 | 按位取反运算符(位运算) | ~num | |
++ | 右结合 | 自增运算符(前置,如++a) | ++i | |
-- | 右结合 | 自减运算符(前置,如--a) | --j | |
- | 右结合 | 负号运算符(单目,取负值) | -10、-x | |
+ | 右结合 | 正号运算符(单目,无实际作用,可省略) | +5、+y | |
* | 右结合 | 取值运算符(指针解引用) | *p | |
& | 右结合 | 取地址运算符 | &a | |
sizeof | 右结合 | 计算数据/变量所占字节数(运算符!非函数) | sizeof(int)、sizeof a | |
(类型名) | 右结合 | 强制类型转换运算符 | (float)a、(int)3.14 | |
| 3 | * | 左结合 | 乘法运算符 | a*b |
/ | 左结合 | 除法运算符(整数相除取整,浮点正常除) | a/b | |
% | 左结合 | 取模运算符(求余数,仅适用于整型) | a%b | |
| 4 | + | 左结合 | 加法运算符 | a+b |
- | 左结合 | 减法运算符 | a-b | |
| 5 | << | 左结合 | 按位左移运算符(位运算) | a<<2 |
>> | 左结合 | 按位右移运算符(位运算) | a>>1 | |
| 6 | > | 左结合 | 大于关系运算符 | a>b |
>= | 左结合 | 大于等于关系运算符 | a>=b | |
< | 左结合 | 小于关系运算符 | a<b | |
<= | 左结合 | 小于等于关系运算符 | a<=b | |
| 7 | == | 左结合 | 等于判断运算符(你之前问的) | a==1 |
!= | 左结合 | 不等于判断运算符 | a!=2 | |
| 8 | & | 左结合 | 按位与运算符(位运算,注意区别取地址&) | a&b |
| 9 | ^ | 左结合 | 按位异或运算符(位运算) | a^b |
| 10 | ` | ` | 左结合 | 按位或运算符(位运算) |
| 11 | && | 左结合 | 逻辑与运算符(你之前问的 | |
| 12 | ` | ` | 左结合 | |
| 13 | ?: | 右结合 | 条件运算符(三目运算符,C语言唯一) | a>0?1:0 |
| 14 | = | 右结合 | 赋值运算符 | a=10 |
+=-= | 右结合 | 复合赋值运算符 | a+=5、b-=3 | |
*=/=%= | 右结合 | 复合赋值运算符 | a*=2、b/=2 | |
<<=>>= | 右结合 | 复合赋值运算符 | a<<=1 | |
&=^=` | =` | 右结合 | 复合赋值运算符 | |
| 15(最低) | , | 左结合 | 逗号运算符(分隔表达式,取最后值) | a=1,b=2,c=3 |
✅ 【必背】高频核心优先级口诀(不用死记全表,记住这个足够开发+笔试)
✔️ 括号最高,单目第二;
✔️ 算术移位,关系相等;
✔️ 位逻逻,三目赋值;
✔️ 逗号最低,永不失误。
口诀解释(对应优先级):
- 括号(1级)优先级绝对第一;单目运算符(2级)第二;
- 算术运算(乘除3级 > 加减4级)→ 移位运算(5级);
- 关系运算(6级)→ 相等运算(7级,==/!=);
- 位运算(按位与8 → 异或9 → 或10)→ 逻辑运算(与11 → 或12);
- 三目运算符(13)→ 赋值运算符(14);
- 逗号运算符(15)优先级最低。
✅ 【高频易错点】5个最容易踩坑的优先级/结合性规则(90%的C语言学习者都会错)
易错点1:赋值运算符是「右结合」
a=b=c;// 等价于 a = (b = c),不是 (a=b)=c因为=是14级,右结合,先算右边的b=c,再把结果赋值给a。
易错点2:sizeof 是「运算符」不是函数
sizeofint;// 合法sizeof(int);// 也合法,括号只是表达式分组,不是函数调用sizeofa;// 合法(a是变量)sizeof优先级是2级,极高,所以sizeof a+1等价于(sizeof a)+1,不是sizeof(a+1)。
易错点3:自增/自减的「前置vs后置」优先级相同,执行时机不同
inta=1;printf("%d",a++);// 输出1,执行后a=2(后置:先取值,后自增)printf("%d",++a);// 输出3,执行前a先自增为3(前置:先自增,后取值)易错点4:逻辑与&&优先级 > 逻辑或||
a||b&&c;// 等价于 a || (b && c),不是 (a||b)&&c这也是为什么你的==+||代码正确,逻辑运算符都是左结合,且同级从左到右。
易错点5:位运算 vs 逻辑运算 优先级区分
按位运算(& ^ |)优先级 > 逻辑运算(&& ||),所以:
a&b||c;// 等价于 (a&b) || c✅ 【实用技巧】记不住优先级?2个万能法则(永远不会错)
- 所有不确定优先级的地方,直接加
()括号,括号优先级最高,强制指定运算顺序,代码可读性也更高,比如:// 不确定优先级,加括号更稳妥if((enable_status==1)||(enable_status==2)) - 赋值表达式尽量单独写,不要和其他运算符混写,比如
a = b + c * d比a = (b + c) * d更清晰,除非明确需求。
总结
- C语言运算符优先级共15级,1级最高,15级最低,同级看结合性;
- 核心优先级关系:
()> 单目 > 算术 > 关系 > 相等 > 位运算 > 逻辑运算 > 三目 > 赋值 > 逗号;