如果这个工具帮到了你,可以请作者喝杯咖啡 ☕
快速查询C#运算符优先级与结合性对照表
x.y主表达式左结合访问对象的成员(字段、方法、属性等)。
obj.Namex?.y主表达式左结合若左操作数为 null 则返回 null,否则访问其成员,避免 NullReferenceException。
obj?.Namef(x)主表达式左结合调用方法或委托。
Console.WriteLine(x)a[i]主表达式左结合访问数组、列表或索引器。
arr[0]a?[i]主表达式左结合若左操作数为 null 则返回 null,否则访问其索引。
list?[0]x++主表达式左结合返回当前值后将变量加 1。
i++x--主表达式左结合返回当前值后将变量减 1。
i--new主表达式右结合创建类型的新实例。
new List<int>()typeof(T)主表达式无结合性返回类型的 System.Type 对象。
typeof(string)checked主表达式无结合性在运算时检查算术溢出,溢出时抛出 OverflowException。
checked(a + b)unchecked主表达式无结合性禁用算术溢出检查,允许结果回绕。
unchecked(a + b)default(T)主表达式无结合性返回类型的默认值(引用类型为 null,值类型为 0 等)。
default(int)nameof主表达式无结合性在编译期返回变量、类型或成员的字符串名称,用于日志或异常。
nameof(MyClass)delegate主表达式左结合声明匿名委托方法。
delegate(int x) { return x * 2; }sizeof主表达式无结合性返回值类型在内存中占用的字节数。
sizeof(int)->主表达式左结合在 unsafe 上下文中通过指针访问结构体成员。
p->X+x一元运算右结合返回操作数的值,保留符号。
+5-x一元运算右结合返回操作数的相反数。
-x!x一元运算右结合对 bool 值取反。
!isReady~x一元运算右结合对整数按位取反,每一位 0 变 1、1 变 0。
~0b1010++x一元运算右结合先将变量加 1,再返回新值。
++i--x一元运算右结合先将变量减 1,再返回新值。
--i(T)x一元运算右结合将表达式显式转换为指定类型。
(int)3.14await一元运算右结合异步等待 Task 完成并返回结果。
await GetAsync()&x一元运算右结合在 unsafe 上下文中获取变量的地址。
&value*x一元运算右结合在 unsafe 上下文中读取指针指向的值。
*ptrue / false一元运算右结合由用户在类型上定义的 true/false 运算符,常用于短路逻辑。
operator true(MyType x)x..y一元运算左结合构造 System.Range,用于切片,例如 arr[1..4]。
arr[1..4]switch一元运算左结合基于模式匹配返回对应的值。
x switch { 1 => "a", _ => "b" }with一元运算左结合复制 record 并修改部分属性。
p with { Age = 18 }*乘除取余左结合两个操作数相乘。
a * b/乘除取余左结合整数除法向零取整;浮点除法返回精确结果。
10 / 3%乘除取余左结合返回两数相除的余数。
10 % 3+加减运算左结合数值相加,或将字符串拼接。
"a" + "b"-加减运算左结合数值相减或从委托链中移除目标。
a - b<<位移运算左结合将位向左移动指定位数,低位补 0。
1 << 3>>位移运算左结合将位向右移动,有符号数保留符号。
8 >> 2>>>位移运算左结合C# 11+ 提供,按位右移并在高位补 0,忽略符号位。
(-1) >>> 1<关系与类型左结合比较两个操作数,左小于右返回 true。
a < b>关系与类型左结合比较两个操作数,左大于右返回 true。
a > b<=关系与类型左结合左小于或等于右返回 true。
a <= b>=关系与类型左结合左大于或等于右返回 true。
a >= bis关系与类型左结合测试对象是否为指定类型或匹配模式。
obj is string sas关系与类型左结合尝试类型转换,失败时返回 null 而不是抛异常。
obj as MyType==相等判断左结合判断两个值是否相等,引用类型默认比较引用,可被重载。
a == b!=相等判断左结合判断两个值是否不相等,可被重载。
a != b&位与逻辑左结合整数按位与,bool 上为非短路逻辑与。
a & b^位与逻辑左结合整数按位异或,bool 上为逻辑异或。
a ^ b|位与逻辑左结合整数按位或,bool 上为非短路逻辑或。
a | b&&位与逻辑左结合短路逻辑与:左操作数为 false 时不计算右操作数。
a && b||位与逻辑左结合短路逻辑或:左操作数为 true 时不计算右操作数。
a || b??条件运算右结合若左操作数为 null 则返回右操作数。
name ?? "匿名"?:条件运算右结合根据条件返回两个值之一,等价于 if-else 表达式。
x > 0 ? "正" : "负"=赋值运算右结合将右操作数的值赋给左操作数。
x = 10+=赋值运算右结合x = x + y,或为事件添加处理器。
x += 1-=赋值运算右结合x = x - y,或为事件移除处理器。
x -= 1*=赋值运算右结合x = x * y 的简写。
x *= 2/=赋值运算右结合x = x / y 的简写。
x /= 2%=赋值运算右结合x = x % y 的简写。
x %= 3&=赋值运算右结合x = x & y 的简写。
x &= 0xFF|=赋值运算右结合x = x | y 的简写。
x |= 0x01^=赋值运算右结合x = x ^ y 的简写。
x ^= mask<<=赋值运算右结合x = x << y 的简写。
x <<= 2>>=赋值运算右结合x = x >> y 的简写。
x >>= 2>>>=赋值运算右结合x = x >>> y 的简写,C# 11+ 支持。
x >>>= 1??=赋值运算右结合仅当左操作数为 null 时才赋值。
name ??= "匿名"=>Lambda 表达式右结合定义匿名函数或表达式体成员。
(x, y) => x + y编写C#代码时,混合使用多种运算符常因优先级混淆导致逻辑错误。本工具提供一个完整的C#运算符执行顺序对照表,清晰列出从高到低的优先级与结合性,帮助开发者快速核对表达式求值顺序,避免因默认顺序引发的bug。
本对照表基于C#语言规范,其他语言(如C++、Java)的优先级规则可能略有差异,请勿混用。用户自定义运算符重载的优先级与原运算符相同。在编写复杂表达式时,即使已参考本表,仍建议使用括号显式指定运算顺序以提高代码可读性和可维护性。
将该对照表作为编写复杂逻辑表达式的速查参考。典型场景:表达式 a + b * c > d && e || f 实际顺序为:先乘法 b*c,再加法 a+乘积,然后比较 >,接着逻辑与 &&,最后逻辑或 ||。推荐改写为 ((a + b * c) > d) && e || f 并进一步用括号明确意图。若不确定,优先加括号,永远比依赖默认优先级更安全。