附录 B运算符优先级速查表C# 运算符优先级和结合性完整参考按优先级从高到低排列本附录目录运算符优先级表结合性说明常见陷阱与注意事项括号的使用建议运算符重载的优先级特殊运算符说明优先级记忆口诀实用示例性能考虑调试技巧运算符优先级表优先级越高的运算符越先执行。同一优先级的运算符按结合性从左到右或从右到左执行。优先级类别运算符结合性说明1基本x.yf(x)a[i]x?.yx?[y]xx--newtypeofcheckeduncheckeddefaultnameofdelegatesizeofstackallocx-y左成员访问方法调用索引访问空条件成员访问空条件索引访问后置递增后置递减对象创建类型获取溢出检查非溢出检查默认值符号名称匿名方法类型大小栈分配指针成员访问2一元x-x!x~xx--x^x(T)xawaitx*xtruefalse右一元加一元减逻辑非按位取反前置递增前置递减索引末尾运算符C# 8.0类型转换异步等待取地址指针间接寻址true 字面量false 字面量3范围x..y左范围运算符C# 8.04Switch 和 withswitchwith左Switch 表达式C# 8.0记录类型修改C# 9.05乘除x * yx / yx % y左乘法除法取余6加减x yx - y左加法或字符串连接减法7移位x yx yx y左左移右移算术右移逻辑C# 118关系和类型测试x yx yx yx yisas左小于大于小于等于大于等于类型检查类型转换9相等x yx ! y左等于不等于10逻辑与布尔和按位x y左按位与整数逻辑与bool不短路11逻辑异或x ^ y左按位异或整数逻辑异或bool12逻辑或x | y左按位或整数逻辑或bool不短路13条件与x y左条件逻辑与短路求值14条件或x || y左条件逻辑或短路求值15空合并和条件x ?? yx ?? yc ? t : f右空合并空合并赋值C# 8.0条件三元运算符16赋值和 Lambdax yx yx - yx * yx / yx % yx yx | yx ^ yx yx yx y右赋值加法赋值减法赋值乘法赋值除法赋值取余赋值与赋值或赋值异或赋值左移赋值右移赋值逻辑右移赋值C# 11Lambda 表达式结合性说明左结合Left-associative运算符从左到右执行。示例a-b-c// 等价于 (a - b) - ca/b/c// 等价于 (a / b) / c右结合Right-associative运算符从右到左执行。示例abc// 等价于 a (b c)x??y??z// 等价于 x ?? (y ?? z)常见陷阱与注意事项1. 位运算优先级低于比较运算符❌错误if(x11)// 错误实际执行x (1 1){// 这不是检查 x 是否为奇数}✅正确if((x1)1)// 正确先计算 x 1再比较{// 检查 x 是否为奇数}2. 条件运算符优先级低于赋值❌错误intresultx0?y1:y2;// 易混淆✅正确intresultx0?1:2;yresult;// 或使用括号明确意图intresult(x0)?(y1):(y2);3. 空合并运算符优先级❌错误stringresulttext??default.ToUpper();// 错误// 实际执行text ?? (default.ToUpper())✅正确stringresult(text??default).ToUpper();// 正确4. 后置递增/递减与其他运算符intx5;intyx*2;// y 10, x 6// 执行顺序// 1. 先取 x 的值5// 2. 计算 5 * 2 10// 3. x 递增为 6inta5;intba*2;// b 12, a 6// 执行顺序// 1. 先递增 a 为 6// 2. 计算 6 * 2 125. 逻辑与/或的短路求值// 和 || 会短路求值boolresultCheckA()CheckB();// 如果 CheckA() 返回 falseCheckB() 不会执行// 和 | 不会短路求值boolresultCheckA()CheckB();// 两个方法都会执行括号的使用建议虽然运算符有明确的优先级但为了代码可读性建议在以下情况使用括号1. 复杂的逻辑表达式✅推荐if((age18age65)||isVIP){// 意图清晰}2. 位运算与比较运算混合✅推荐if((flagsFLAG_ENABLED)!0){// 明确先计算位运算}3. 多个条件运算符嵌套✅推荐stringstatus(score90)?A:(score80)?B:(score70)?C:D;4. 算术与比较混合✅推荐if((xy)(z*2)){// 即使不需要括号但提高了可读性}运算符重载的优先级自定义运算符重载不能改变运算符的优先级和结合性。publicclassVector{publicintX{get;set;}publicintY{get;set;}// 重载 运算符但优先级仍然是加减级别publicstaticVectoroperator(Vectora,Vectorb){returnnewVector{Xa.Xb.X,Ya.Yb.Y};}// 重载 * 运算符优先级仍然高于 publicstaticVectoroperator*(Vectorv,intscalar){returnnewVector{Xv.X*scalar,Yv.Y*scalar};}}// 使用示例varresultv1v2*2;// 先执行 v2 * 2再执行 v1 ...特殊运算符说明成员访问.优先级最高总是最先执行。object.Method().Property[0]// 执行顺序// 1. object.Method()// 2. 结果.Property// 3. 结果[0]空条件运算符?.和?[]string?resultobj?.Property?.ToUpper();// 如果 obj 或 Property 为 null整个表达式返回 null// 不会抛出 NullReferenceException空合并运算符??stringnameuserName??defaultName??Anonymous;// 右结合userName ?? (defaultName ?? Anonymous)范围运算符..varslicearray[1..^1];// 从索引 1 到倒数第二个元素varrange1..10;// Range 对象Switch 表达式C# 8.0stringresultstatusswitch{0Pending,1Active,_Unknown};With 表达式C# 9.0varperson2person1with{Age30};// 创建 person1 的副本但 Age 改为 30优先级记忆口诀从高到低成员点调索成员访问、方法调用、索引一元增减反一元运算符、递增递减乘除取余加减移位比较小于、大于等相等等于、不等于按位与按位异或按位或条件与条件或||空合并条件??、?:赋值Lambda、、实用示例示例 1复杂表达式求值inta5,b10,c15;intresultab*c/5-2;// 执行顺序// 1. b * c 150 乘法优先级高// 2. 150 / 5 30 除法与乘法同级从左到右// 3. a 30 35 加法// 4. 35 - 2 33 减法与加法同级从左到右// 结果33示例 2逻辑表达式boolresultx0y100||z50;// 执行顺序// 1. x 0 比较运算// 2. y 100 比较运算// 3. (1) (2) 条件与// 4. z 50 相等// 5. (3) || (4) 条件或示例 3空合并链stringresultconfig?.GetValue(key)??Environment.GetEnvironmentVariable(KEY)??default;// 执行顺序// 1. config?.GetValue(key)// 2. 如果为 null尝试 Environment.GetEnvironmentVariable(KEY)// 3. 如果仍为 null使用 default示例 4位运算陷阱intflags0b1010;// ❌ 错误if(flags0b00100b0010)// 实际flags (0b0010 0b0010){// 不会按预期工作}// ✅ 正确if((flags0b0010)0b0010)// 先位运算再比较{// 正确检查标志位}// ✅ 更简洁if((flags0b0010)!0)// 标志位存在{// 更常用的写法}性能考虑短路求值的性能优势// 将快速检查放在前面if(quickCheck()expensiveCheck()){// 如果 quickCheck() 返回 falseexpensiveCheck() 不会执行}// 优化示例if(list!nulllist.Count0)// 先检查 null避免异常{// 安全访问 list.Count}避免重复计算// ❌ 低效if(Calculate()10Calculate()20){// Calculate() 被调用了两次}// ✅ 高效intvalueCalculate();if(value10value20){// Calculate() 只调用一次}调试技巧当不确定运算符优先级时使用括号明确意图提高可读性避免歧义分步计算将复杂表达式拆分为多个步骤使用调试器单步执行观察表达式求值顺序编写单元测试验证表达式行为是否符合预期// 复杂表达式varresultab*c/d-e;// 分步计算调试时更清晰vartemp1b*c;vartemp2temp1/d;vartemp3atemp2;varresulttemp3-e;快速查找使用 CtrlF 搜索运算符符号或类别名称即可快速定位。