附录B 运算符优先级速查表概述C语言的运算符优先级决定了表达式的求值顺序。优先级高的运算符先计算优先级相同时按结合性决定顺序。本附录提供完整的运算符优先级表和常见陷阱。完整优先级表从高到低排列同一行的运算符优先级相同。优先级运算符名称结合性示例1()[]-.括号、下标、成员访问左→右func()arr[i]ptr-xobj.y2--后缀自增/自减左→右ii--3---!~*sizeof(type)前缀自增/自减、一元运算符右→左i-x!flag*ptrvarsizeof(int)(int)x4*/%乘法、除法、取模左→右a * ba / ba % b5-加法、减法左→右a ba - b6左移、右移左→右x 2x 17关系运算符左→右a ba b8!相等、不等左→右a ba ! b9按位与左→右a b10^按位异或左→右a ^ b11按位或左→右12逻辑与左→右a b13逻辑或14?:条件运算符右→左cond ? a : b15-*/%^赋值运算符右→左16,逗号运算符左→右a, b, c详细说明优先级1后缀运算符最高intarr[10];structPoint{intx,y;}p,*ptrp;arr[5]// 数组下标ptr-x// 指针成员访问p.y// 结构体成员访问func(1,2)// 函数调用优先级2后缀自增/自减inti5;intxi;// x 5, i 6先使用后自增intyi--;// y 6, i 5先使用后自减优先级3前缀运算符inti5;intxi;// x 6, i 6先自增后使用inty--i;// y 5, i 5先自减后使用inta10;intb-a;// 负号intca;// 正号通常无意义intd!a;// 逻辑非inte~a;// 按位取反int*ptra;// 取地址intval*ptr;// 解引用size_tszsizeof(int);// 计算大小doublef(double)a;// 类型转换优先级4-5算术运算符inta10,b3;intmula*b;// 30乘法intdiva/b;// 3除法整数除法intmoda%b;// 1取模intaddab;// 13加法intsuba-b;// 7减法优先级6移位运算符intx5;// 二进制0000 0101intleftx1;// 10左移1位0000 1010intrightx1;// 2右移1位0000 0010优先级7-8关系和相等运算符inta5,b10;intr1ab;// 1真intr2ab;// 1真intr3ab;// 0假intr4ab;// 0假intr5ab;// 0假intr6a!b;// 1真优先级9-11位运算符inta0b1100;// 12intb0b1010;// 10intand_resultab;// 0b1000 8按位与intxor_resulta^b;// 0b0110 6按位异或intor_resulta|b;// 0b1110 14按位或优先级12-13逻辑运算符inta5,b0;intand_resultab;// 0逻辑与短路求值intor_resulta||b;// 1逻辑或短路求值// 短路求值示例intx0;if(x!010/x1){// 不会执行除法避免除零错误// ...}优先级14条件运算符inta5,b10;intmax(ab)?a:b;// max 10// 嵌套条件运算符intx5;char*grade(x90)?A:(x80)?B:(x70)?C:F;优先级15赋值运算符intx10;x5;// 等价于 x x 5x-3;// 等价于 x x - 3x*2;// 等价于 x x * 2x/4;// 等价于 x x / 4x%3;// 等价于 x x % 3x0xFF;// 等价于 x x 0xFFx|0x10;// 等价于 x x | 0x10x^0x01;// 等价于 x x ^ 0x01x2;// 等价于 x x 2x1;// 等价于 x x 1优先级16逗号运算符最低inta,b,c;intx(a1,b2,c3);// x 3返回最后一个表达式的值// 常用于for循环for(inti0,j10;ij;i,j--){// ...}常见陷阱陷阱1位运算符优先级低于关系运算符intx5,y3;// ❌ 错误会被解析为 x (y 1)if(xy1){// ...}// ✅ 正确使用括号if((x1)(y1)){// ...}陷阱2逻辑运算符与位运算符混淆inta1,b2;// ❌ 错误 是按位与不是逻辑与if(a0b0){// 结果可能不符合预期// ...}// ✅ 正确使用逻辑与if(a0b0){// ...}陷阱3赋值运算符优先级低intx,y5;// ❌ 错误会被解析为 if ((x (y 5)))if(xy5){// x 1真而不是 x 5}// ✅ 正确使用括号或分开写if((xy)5){// ...}// 或者xy;if(x5){// ...}陷阱4自增自减运算符的副作用inti0;intarr[5]{1,2,3,4,5};// ❌ 未定义行为i被修改多次intxarr[i]arr[i];// ✅ 正确分开写intxarr[i];i;xarr[i];i;陷阱5条件运算符的结合性inta1,b2,c3;// ❌ 容易误解从左到右intxa?b:c?10:20;// 实际解析为右结合intxa?b:(c?10:20);// x 2// ✅ 建议使用括号明确意图intxa?b:(c?10:20);陷阱6sizeof运算符的优先级intarr[10];// ❌ 错误会被解析为 sizeof(arr[0]) 1size_tszsizeofarr[0]1;// ✅ 正确使用括号size_tszsizeof(arr[0])1;记忆技巧口诀括号下标成员高优先级1-2 一元运算次之找优先级3 乘除取模再算术优先级4-5 移位关系紧相连优先级6-7 相等位运逻辑判优先级8-13 条件赋值逗号垫优先级14-16分层记忆最高层括号、数组、成员访问一元层自增自减、取地址、解引用、sizeof算术层乘除模、加减移位层左移右移比较层关系、相等位运算层按位与、异或、或逻辑层逻辑与、逻辑或最低层条件、赋值、逗号最佳实践1. 不确定时使用括号// ❌ 依赖优先级容易出错intresultab*cd|e;// ✅ 使用括号清晰明确intresult((a(b*c))d)|e;2. 一行只做一件事// ❌ 复杂表达式intresultx*y--z/w--;// ✅ 分步计算inttemp1x*y;x;y--;inttemp2z/w;z;w--;intresulttemp1temp2;3. 避免副作用// ❌ 多次修改同一变量inti0;intxii;// 未定义行为// ✅ 分开写inti0;intxi;i;i;xi;4. 使用const避免赋值错误constintMAX100;// ❌ 编译错误不能修改const变量if(xMAX){// 编译器会报错// ...}// ✅ 正确if(xMAX){// ...}快速参考卡片按优先级分组组别运算符后缀()[]-.--一元---!~*sizeof(type)算术*/%-移位关系!位运算^逻辑其他?:,参考资料ISO/IEC 9899:2011 (C11标准)《C程序设计语言》KR《C陷阱与缺陷》
附录B 运算符优先级速查表
附录B 运算符优先级速查表概述C语言的运算符优先级决定了表达式的求值顺序。优先级高的运算符先计算优先级相同时按结合性决定顺序。本附录提供完整的运算符优先级表和常见陷阱。完整优先级表从高到低排列同一行的运算符优先级相同。优先级运算符名称结合性示例1()[]-.括号、下标、成员访问左→右func()arr[i]ptr-xobj.y2--后缀自增/自减左→右ii--3---!~*sizeof(type)前缀自增/自减、一元运算符右→左i-x!flag*ptrvarsizeof(int)(int)x4*/%乘法、除法、取模左→右a * ba / ba % b5-加法、减法左→右a ba - b6左移、右移左→右x 2x 17关系运算符左→右a ba b8!相等、不等左→右a ba ! b9按位与左→右a b10^按位异或左→右a ^ b11按位或左→右12逻辑与左→右a b13逻辑或14?:条件运算符右→左cond ? a : b15-*/%^赋值运算符右→左16,逗号运算符左→右a, b, c详细说明优先级1后缀运算符最高intarr[10];structPoint{intx,y;}p,*ptrp;arr[5]// 数组下标ptr-x// 指针成员访问p.y// 结构体成员访问func(1,2)// 函数调用优先级2后缀自增/自减inti5;intxi;// x 5, i 6先使用后自增intyi--;// y 6, i 5先使用后自减优先级3前缀运算符inti5;intxi;// x 6, i 6先自增后使用inty--i;// y 5, i 5先自减后使用inta10;intb-a;// 负号intca;// 正号通常无意义intd!a;// 逻辑非inte~a;// 按位取反int*ptra;// 取地址intval*ptr;// 解引用size_tszsizeof(int);// 计算大小doublef(double)a;// 类型转换优先级4-5算术运算符inta10,b3;intmula*b;// 30乘法intdiva/b;// 3除法整数除法intmoda%b;// 1取模intaddab;// 13加法intsuba-b;// 7减法优先级6移位运算符intx5;// 二进制0000 0101intleftx1;// 10左移1位0000 1010intrightx1;// 2右移1位0000 0010优先级7-8关系和相等运算符inta5,b10;intr1ab;// 1真intr2ab;// 1真intr3ab;// 0假intr4ab;// 0假intr5ab;// 0假intr6a!b;// 1真优先级9-11位运算符inta0b1100;// 12intb0b1010;// 10intand_resultab;// 0b1000 8按位与intxor_resulta^b;// 0b0110 6按位异或intor_resulta|b;// 0b1110 14按位或优先级12-13逻辑运算符inta5,b0;intand_resultab;// 0逻辑与短路求值intor_resulta||b;// 1逻辑或短路求值// 短路求值示例intx0;if(x!010/x1){// 不会执行除法避免除零错误// ...}优先级14条件运算符inta5,b10;intmax(ab)?a:b;// max 10// 嵌套条件运算符intx5;char*grade(x90)?A:(x80)?B:(x70)?C:F;优先级15赋值运算符intx10;x5;// 等价于 x x 5x-3;// 等价于 x x - 3x*2;// 等价于 x x * 2x/4;// 等价于 x x / 4x%3;// 等价于 x x % 3x0xFF;// 等价于 x x 0xFFx|0x10;// 等价于 x x | 0x10x^0x01;// 等价于 x x ^ 0x01x2;// 等价于 x x 2x1;// 等价于 x x 1优先级16逗号运算符最低inta,b,c;intx(a1,b2,c3);// x 3返回最后一个表达式的值// 常用于for循环for(inti0,j10;ij;i,j--){// ...}常见陷阱陷阱1位运算符优先级低于关系运算符intx5,y3;// ❌ 错误会被解析为 x (y 1)if(xy1){// ...}// ✅ 正确使用括号if((x1)(y1)){// ...}陷阱2逻辑运算符与位运算符混淆inta1,b2;// ❌ 错误 是按位与不是逻辑与if(a0b0){// 结果可能不符合预期// ...}// ✅ 正确使用逻辑与if(a0b0){// ...}陷阱3赋值运算符优先级低intx,y5;// ❌ 错误会被解析为 if ((x (y 5)))if(xy5){// x 1真而不是 x 5}// ✅ 正确使用括号或分开写if((xy)5){// ...}// 或者xy;if(x5){// ...}陷阱4自增自减运算符的副作用inti0;intarr[5]{1,2,3,4,5};// ❌ 未定义行为i被修改多次intxarr[i]arr[i];// ✅ 正确分开写intxarr[i];i;xarr[i];i;陷阱5条件运算符的结合性inta1,b2,c3;// ❌ 容易误解从左到右intxa?b:c?10:20;// 实际解析为右结合intxa?b:(c?10:20);// x 2// ✅ 建议使用括号明确意图intxa?b:(c?10:20);陷阱6sizeof运算符的优先级intarr[10];// ❌ 错误会被解析为 sizeof(arr[0]) 1size_tszsizeofarr[0]1;// ✅ 正确使用括号size_tszsizeof(arr[0])1;记忆技巧口诀括号下标成员高优先级1-2 一元运算次之找优先级3 乘除取模再算术优先级4-5 移位关系紧相连优先级6-7 相等位运逻辑判优先级8-13 条件赋值逗号垫优先级14-16分层记忆最高层括号、数组、成员访问一元层自增自减、取地址、解引用、sizeof算术层乘除模、加减移位层左移右移比较层关系、相等位运算层按位与、异或、或逻辑层逻辑与、逻辑或最低层条件、赋值、逗号最佳实践1. 不确定时使用括号// ❌ 依赖优先级容易出错intresultab*cd|e;// ✅ 使用括号清晰明确intresult((a(b*c))d)|e;2. 一行只做一件事// ❌ 复杂表达式intresultx*y--z/w--;// ✅ 分步计算inttemp1x*y;x;y--;inttemp2z/w;z;w--;intresulttemp1temp2;3. 避免副作用// ❌ 多次修改同一变量inti0;intxii;// 未定义行为// ✅ 分开写inti0;intxi;i;i;xi;4. 使用const避免赋值错误constintMAX100;// ❌ 编译错误不能修改const变量if(xMAX){// 编译器会报错// ...}// ✅ 正确if(xMAX){// ...}快速参考卡片按优先级分组组别运算符后缀()[]-.--一元---!~*sizeof(type)算术*/%-移位关系!位运算^逻辑其他?:,参考资料ISO/IEC 9899:2011 (C11标准)《C程序设计语言》KR《C陷阱与缺陷》