C语言中的运算符

C语言中的运算符非常丰富,大约有40多种,按照功能可以分为以下几类。下面按优先级从高到低整理,并标注结合方向(绝大多数是左结合,只有少数特殊的是右结合)。

运算符分类与优先级完整对照表(C11/C17标准)

优先级运算符含义 / 类别结合方向说明 / 常见陷阱
1()括号 / 函数调用左→右最高优先级,用于改变顺序
1[]数组下标左→右
1. ->结构体/联合体成员访问左→右-> 用于指针
1++ -- (后置)后置自增/自减左→右i++ 先用后加
2++ -- (前置)前置自增/自减右→左++i 先加后用
2+ - (单目)正号 / 负号右→左
2! ~逻辑非 / 按位取反右→左
2* (解引用) & (取地址)指针解引用 / 取地址右→左
2(类型)强制类型转换右→左
2sizeof求大小(编译期)右→左sizeof int 需要括号
3* / %乘、除、取模左→右
4+ - (双目)加、减左→右
5<< >>左移、右移左→右位运算,移位次数受限于类型宽度
6< <= > >=关系运算符左→右
7== !=相等、不等左→右
8&按位与左→右
9^按位异或左→右
10|按位或左→右
11&&逻辑与(短路)左→右左边为假,右边不计算
12||逻辑或(短路)左→右左边为真,右边不计算
13?:三目条件运算符右→左C中唯一的三目运算符
14= += -= *= /= %=赋值及复合赋值右→左a = b = c 从右向左
14&= ^= |= <<= >>=位复合赋值右→左
15,逗号运算符(顺序求值)左→右优先级最低,整个表达式值是最后一个子表达式的值

常见分类速记(按功能分组)

类别运算符优先级范围结合方向备注
算术+ - * / % ++ --2~4左→右(自增自减除外)
移位<< >>5左→右
关系< <= > >= == !=6~7左→右
位运算& ^ | ~8~10,2左→右(~除外)优先级低于比较,高于逻辑
逻辑&& || !11~12,2左→右(!除外)短路求值
条件?:13右→左
赋值= +=14右→左复合赋值与普通赋值同级
顺序,15左→右最低,常用于for循环
其他sizeof (类型) & * . -> [] ()1~2混合单目大多右结合

经典易错例子(强烈建议自己跑一遍)

int a = 5, b = 3, c = 2;
int x;

// 这些表达式的值分别是多少?
x = a + b * c;          // 11   (先 * 后 +)
x = a++ + ++b;          // 9    (a先用5再+1, b先+1成4再用)
x = a > b ? a : b++;    // 5    (三目右结合,但这里不影响)
x = a & b == 1;         // 0    (== 优先级高于 &,相当于 a & (b==1))
x = !a && b++;          // 0    (短路,b++不执行)
x = (a=2, a+=3, a*4);   // 20   (逗号表达式,整个值是最后一个)

记忆口诀(面试/刷题常用)

  • 括号 > 单目 > 算术 > 移位 > 关系 > 位运算 > 逻辑 > 条件 > 赋值 > 逗号
  • 单目、赋值、三目 → 右结合(其他几乎都是左结合)
  • 位运算优先级低于比较运算符(最经典陷阱:a & b == 0 要加括号)
  • 逻辑与或短路(&& || 不要写有副作用的右表达式)
  • 后置 ++ — 高于前置(但只差一级,且都在单目层)

如果你想针对某类运算符(位运算、逻辑、赋值等)做更详细的例子、陷阱题或优先级推导过程,可以直接告诉我,我继续展开~

文章已创建 4298

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部