5步终极方案:用WarcraftHelper让魔兽争霸III在现代Windows系统完美运行
2026/4/16 10:57:15
核心优先级关系:()> 单目 > 算术 > 关系 > 相等 > 位运算 > 逻辑运算 > 三目 > 赋值 > 逗号;✅ 核心规则(重中之重,必须记住):
()是优先级最高的运算符,任何时候想强制改变运算顺序,用()包裹即可,永远不会出错。核心优先级关系:()> 单目 > 算术 > 关系 > 相等 > 位运算 > 逻辑运算 > 三目 > 赋值 > 逗号;
| 优先级 | 运算符 | 结合性 | 运算符名称/含义说明 | 举例 |
|---|---|---|---|---|
| 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 |
✔️ 括号最高,单目第二;
✔️ 算术移位,关系相等;
✔️ 位逻逻,三目赋值;
✔️ 逗号最低,永不失误。
a=b=c;// 等价于 a = (b = c),不是 (a=b)=c因为=是14级,右结合,先算右边的b=c,再把结果赋值给a。
sizeofint;// 合法sizeof(int);// 也合法,括号只是表达式分组,不是函数调用sizeofa;// 合法(a是变量)sizeof优先级是2级,极高,所以sizeof a+1等价于(sizeof a)+1,不是sizeof(a+1)。
inta=1;printf("%d",a++);// 输出1,执行后a=2(后置:先取值,后自增)printf("%d",++a);// 输出3,执行前a先自增为3(前置:先自增,后取值)&&优先级 > 逻辑或||a||b&&c;// 等价于 a || (b && c),不是 (a||b)&&c这也是为什么你的==+||代码正确,逻辑运算符都是左结合,且同级从左到右。
按位运算(& ^ |)优先级 > 逻辑运算(&& ||),所以:
a&b||c;// 等价于 (a&b) || c()括号,括号优先级最高,强制指定运算顺序,代码可读性也更高,比如:// 不确定优先级,加括号更稳妥if((enable_status==1)||(enable_status==2))a = b + c * d比a = (b + c) * d更清晰,除非明确需求。()> 单目 > 算术 > 关系 > 相等 > 位运算 > 逻辑运算 > 三目 > 赋值 > 逗号;