附录B 运算符优先级速查表
2026/7/26 7:18:14 网站建设 项目流程

附录B 运算符优先级速查表


概述

C语言的运算符优先级决定了表达式的求值顺序。优先级高的运算符先计算,优先级相同时按结合性决定顺序。本附录提供完整的运算符优先级表和常见陷阱。


完整优先级表

从高到低排列,同一行的运算符优先级相同。

优先级运算符名称结合性示例
1()[]->.括号、下标、成员访问左→右func()arr[i]ptr->xobj.y
2++--后缀自增/自减左→右i++i--
3++--+-!~*&sizeof(type)前缀自增/自减、一元运算符右→左++i-x!flag*ptr&varsizeof(int)(int)x
4*/%乘法、除法、取模左→右a * ba / ba % b
5+-加法、减法左→右a + ba - b
6<<>>左移、右移左→右x << 2x >> 1
7<<=>>=关系运算符左→右a < ba >= b
8==!=相等、不等左→右a == ba != b
9&按位与左→右a & b
10^按位异或左→右a ^ b
11``按位或左→右
12&&逻辑与左→右a && b
13``逻辑或
14?:条件运算符右→左cond ? a : b
15=+=-=*=/=%=&=^=`=<<=>>=`赋值运算符右→左
16,逗号运算符左→右a, b, c

详细说明

优先级1:后缀运算符(最高)

intarr[10];structPoint{intx,y;}p,*ptr=&p;arr[5]// 数组下标ptr->x// 指针成员访问p.y// 结构体成员访问func(1,2)// 函数调用

优先级2:后缀自增/自减

inti=5;intx=i++;// x = 5, i = 6(先使用后自增)inty=i--;// y = 6, i = 5(先使用后自减)

优先级3:前缀运算符

inti=5;intx=++i;// x = 6, i = 6(先自增后使用)inty=--i;// y = 5, i = 5(先自减后使用)inta=10;intb=-a;// 负号intc=+a;// 正号(通常无意义)intd=!a;// 逻辑非inte=~a;// 按位取反int*ptr=&a;// 取地址intval=*ptr;// 解引用size_tsz=sizeof(int);// 计算大小doublef=(double)a;// 类型转换

优先级4-5:算术运算符

inta=10,b=3;intmul=a*b;// 30(乘法)intdiv=a/b;// 3(除法,整数除法)intmod=a%b;// 1(取模)intadd=a+b;// 13(加法)intsub=a-b;// 7(减法)

优先级6:移位运算符

intx=5;// 二进制:0000 0101intleft=x<<1;// 10(左移1位:0000 1010)intright=x>>1;// 2(右移1位:0000 0010)

优先级7-8:关系和相等运算符

inta=5,b=10;intr1=a<b;// 1(真)intr2=a<=b;// 1(真)intr3=a>b;// 0(假)intr4=a>=b;// 0(假)intr5=a==b;// 0(假)intr6=a!=b;// 1(真)

优先级9-11:位运算符

inta=0b1100;// 12intb=0b1010;// 10intand_result=a&b;// 0b1000 = 8(按位与)intxor_result=a^b;// 0b0110 = 6(按位异或)intor_result=a|b;// 0b1110 = 14(按位或)

优先级12-13:逻辑运算符

inta=5,b=0;intand_result=a&&b;// 0(逻辑与,短路求值)intor_result=a||b;// 1(逻辑或,短路求值)// 短路求值示例intx=0;if(x!=0&&10/x>1){// 不会执行除法,避免除零错误// ...}

优先级14:条件运算符

inta=5,b=10;intmax=(a>b)?a:b;// max = 10// 嵌套条件运算符intx=5;char*grade=(x>=90)?"A":(x>=80)?"B":(x>=70)?"C":"F";

优先级15:赋值运算符

intx=10;x+=5;// 等价于 x = x + 5x-=3;// 等价于 x = x - 3x*=2;// 等价于 x = x * 2x/=4;// 等价于 x = x / 4x%=3;// 等价于 x = x % 3x&=0xFF;// 等价于 x = x & 0xFFx|=0x10;// 等价于 x = x | 0x10x^=0x01;// 等价于 x = x ^ 0x01x<<=2;// 等价于 x = x << 2x>>=1;// 等价于 x = x >> 1

优先级16:逗号运算符(最低)

inta,b,c;intx=(a=1,b=2,c=3);// x = 3(返回最后一个表达式的值)// 常用于for循环for(inti=0,j=10;i<j;i++,j--){// ...}

常见陷阱

陷阱1:位运算符优先级低于关系运算符

intx=5,y=3;// ❌ 错误:会被解析为 x == (y & 1)if(x==y&1){// ...}// ✅ 正确:使用括号if((x&1)==(y&1)){// ...}

陷阱2:逻辑运算符与位运算符混淆

inta=1,b=2;// ❌ 错误:& 是按位与,不是逻辑与if(a>0&b>0){// 结果可能不符合预期// ...}// ✅ 正确:使用逻辑与if(a>0&&b>0){// ...}

陷阱3:赋值运算符优先级低

intx,y=5;// ❌ 错误:会被解析为 if ((x = (y == 5)))if(x=y==5){// x = 1(真),而不是 x = 5}// ✅ 正确:使用括号或分开写if((x=y)==5){// ...}// 或者x=y;if(x==5){// ...}

陷阱4:自增自减运算符的副作用

inti=0;intarr[5]={1,2,3,4,5};// ❌ 未定义行为:i被修改多次intx=arr[i++]+arr[i++];// ✅ 正确:分开写intx=arr[i];i++;x+=arr[i];i++;

陷阱5:条件运算符的结合性

inta=1,b=2,c=3;// ❌ 容易误解:从左到右?intx=a?b:c?10:20;// 实际解析为(右结合):intx=a?b:(c?10:20);// x = 2// ✅ 建议:使用括号明确意图intx=a?b:(c?10:20);

陷阱6:sizeof运算符的优先级

intarr[10];// ❌ 错误:会被解析为 sizeof(arr[0]) + 1size_tsz=sizeofarr[0]+1;// ✅ 正确:使用括号size_tsz=sizeof(arr[0])+1;

记忆技巧

口诀

括号下标成员高(优先级1-2) 一元运算次之找(优先级3) 乘除取模再算术(优先级4-5) 移位关系紧相连(优先级6-7) 相等位运逻辑判(优先级8-13) 条件赋值逗号垫(优先级14-16)

分层记忆

  1. 最高层:括号、数组、成员访问
  2. 一元层:自增自减、取地址、解引用、sizeof
  3. 算术层:乘除模、加减
  4. 移位层:左移右移
  5. 比较层:关系、相等
  6. 位运算层:按位与、异或、或
  7. 逻辑层:逻辑与、逻辑或
  8. 最低层:条件、赋值、逗号

最佳实践

1. 不确定时使用括号

// ❌ 依赖优先级,容易出错intresult=a+b*c&d|e;// ✅ 使用括号,清晰明确intresult=((a+(b*c))&d)|e;

2. 一行只做一件事

// ❌ 复杂表达式intresult=x++*y--+z++/w--;// ✅ 分步计算inttemp1=x*y;x++;y--;inttemp2=z/w;z++;w--;intresult=temp1+temp2;

3. 避免副作用

// ❌ 多次修改同一变量inti=0;intx=i+++++i;// 未定义行为// ✅ 分开写inti=0;intx=i;i++;i++;x+=i;

4. 使用const避免赋值错误

constintMAX=100;// ❌ 编译错误:不能修改const变量if(x=MAX){// 编译器会报错// ...}// ✅ 正确if(x==MAX){// ...}

快速参考卡片

按优先级分组

组别运算符
后缀()[]->.++--
一元++--+-!~*&sizeof(type)
算术*/%+-
移位<<>>
关系<<=>>===!=
位运算&^`
逻辑&&`
其他?:=,

参考资料

  • ISO/IEC 9899:2011 (C11标准)
  • 《C程序设计语言》(K&R)
  • 《C陷阱与缺陷》

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询