UE4SS DLL错误排查指南:从原理到实战解决游戏Mod加载问题
2026/7/26 8:08:06
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 |
intarr[10];structPoint{intx,y;}p,*ptr=&p;arr[5]// 数组下标ptr->x// 指针成员访问p.y// 结构体成员访问func(1,2)// 函数调用inti=5;intx=i++;// x = 5, i = 6(先使用后自增)inty=i--;// y = 6, i = 5(先使用后自减)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;// 类型转换inta=10,b=3;intmul=a*b;// 30(乘法)intdiv=a/b;// 3(除法,整数除法)intmod=a%b;// 1(取模)intadd=a+b;// 13(加法)intsub=a-b;// 7(减法)intx=5;// 二进制:0000 0101intleft=x<<1;// 10(左移1位:0000 1010)intright=x>>1;// 2(右移1位:0000 0010)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(真)inta=0b1100;// 12intb=0b1010;// 10intand_result=a&b;// 0b1000 = 8(按位与)intxor_result=a^b;// 0b0110 = 6(按位异或)intor_result=a|b;// 0b1110 = 14(按位或)inta=5,b=0;intand_result=a&&b;// 0(逻辑与,短路求值)intor_result=a||b;// 1(逻辑或,短路求值)// 短路求值示例intx=0;if(x!=0&&10/x>1){// 不会执行除法,避免除零错误// ...}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";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 >> 1inta,b,c;intx=(a=1,b=2,c=3);// x = 3(返回最后一个表达式的值)// 常用于for循环for(inti=0,j=10;i<j;i++,j--){// ...}intx=5,y=3;// ❌ 错误:会被解析为 x == (y & 1)if(x==y&1){// ...}// ✅ 正确:使用括号if((x&1)==(y&1)){// ...}inta=1,b=2;// ❌ 错误:& 是按位与,不是逻辑与if(a>0&b>0){// 结果可能不符合预期// ...}// ✅ 正确:使用逻辑与if(a>0&&b>0){// ...}intx,y=5;// ❌ 错误:会被解析为 if ((x = (y == 5)))if(x=y==5){// x = 1(真),而不是 x = 5}// ✅ 正确:使用括号或分开写if((x=y)==5){// ...}// 或者x=y;if(x==5){// ...}inti=0;intarr[5]={1,2,3,4,5};// ❌ 未定义行为:i被修改多次intx=arr[i++]+arr[i++];// ✅ 正确:分开写intx=arr[i];i++;x+=arr[i];i++;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);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)// ❌ 依赖优先级,容易出错intresult=a+b*c&d|e;// ✅ 使用括号,清晰明确intresult=((a+(b*c))&d)|e;// ❌ 复杂表达式intresult=x++*y--+z++/w--;// ✅ 分步计算inttemp1=x*y;x++;y--;inttemp2=z/w;z++;w--;intresult=temp1+temp2;// ❌ 多次修改同一变量inti=0;intx=i+++++i;// 未定义行为// ✅ 分开写inti=0;intx=i;i++;i++;x+=i;constintMAX=100;// ❌ 编译错误:不能修改const变量if(x=MAX){// 编译器会报错// ...}// ✅ 正确if(x==MAX){// ...}| 组别 | 运算符 |
|---|---|
| 后缀 | ()[]->.++-- |
| 一元 | ++--+-!~*&sizeof(type) |
| 算术 | */%+- |
| 移位 | <<>> |
| 关系 | <<=>>===!= |
| 位运算 | &^` |
| 逻辑 | &&` |
| 其他 | ?:=, |
参考资料: