C#运算符详解

一、运算符分类与功能‌

1‌.算术运算符‌

  • 基本运算‌:+(加)、-(减)、*(乘)、/(除)、%(取模)
csharp 复制代码
int a = 10 / 3;    // 结果为3(整数除法)  
double b = 10.0 / 3; // 结果为3.333...  
  • ‌自增/自减‌:++(前置/后置)、--(前置/后置)
csharp 复制代码
int x = 5;  
int y = x++;  // y=5(后置:先赋值后自增)  
int z = ++x;  // z=7(前置:先自增后赋值)  

2‌.赋值运算符‌

  • ‌简单赋值‌:=(将右值赋给左变量)
  • ‌复合赋值‌:+=、-=、*=、/=、%=(简化运算与赋值)
csharp 复制代码
int num = 10;  
num += 5;  // 等效于 num = num + 5  

3‌.关系运算符‌

  • ‌比较值‌:==(相等)、!=(不等)、>、<、>=、<=
csharp 复制代码
bool result = (10 > 5);  // true  
  • 类型检查‌:is(类型兼容性判断)、as(安全类型转换)
csharp 复制代码
object obj = "Hello";  
if (obj is string) {  
    string s = obj as string;  // 转换成功返回string,否则null  
}  

4‌.逻辑运算符‌

  • ‌布尔运算‌:&&(逻辑与)、||(逻辑或)、!(逻辑非)
csharp 复制代码
bool cond1 = true, cond2 = false;  
bool res = cond1 && !cond2;  // true  
  • 短路特性‌:&&和||若左操作数已确定结果,则跳过右操作数计算

‌5.位运算符‌

  • 位操作‌:&(按位与)、|(按位或)、^(异或)、~(取反)、<<(左移)、>>(右移)
csharp 复制代码
int x = 5;          // 二进制 0101  
int y = x << 2;     // 左移两位 → 10100(十进制20)  

‌6.条件运算符(三元运算符)‌

  • ‌语法‌:条件 ? 表达式1 : 表达式2
csharp 复制代码
int score = 80;  
string grade = score >= 60 ? "及格" : "不及格";//返回"及格",也就是说是true返回":"号左侧的,否则返回右侧的

二、运算符优先级与结合性‌

‌优先级‌ ‌运算符类型‌ ‌ 示例‌
最高 括号()、成员访问. (a + b) * c
一元运算符(!、++、--) !flag、++x
乘除/取模(*、/、%) a * b + c
加减(+、-) x + y - z
关系运算符(>、<等) a > b && c < d
最低 赋值运算符(=、+=等) x = y + 5

‌关键规则‌:

  • 同优先级运算符按‌从左到右‌顺序执行(赋值运算符除外,如=从右向左结合)‌
  • 使用括号显式指定优先级可提升代码可读性

三、特殊运算符与场景‌

1‌.类型转换运算符‌

  • 显式转换‌:(目标类型)值(可能引发溢出异常)
csharp 复制代码
double d = 3.14;  
int i = (int)d;  // i=3  
  • 安全转换‌:as运算符(失败返回null,仅适用于引用类型和可空类型)‌

‌2.溢出控制运算符‌

  • checked/unchecked‌:控制算术运算是否检查溢出
csharp 复制代码
checked {  
    int max = int.MaxValue;  
    int overflow = max + 1;  // 抛出OverflowException  
}  

3‌.空合并运算符‌

  • 语法‌:??(若左值为null,返回右值)
csharp 复制代码
string name = null;  
string displayName = name ?? "未知";  // 返回"未知"  

‌四、使用建议‌

  • ‌避免歧义‌:复杂表达式使用括号明确优先级‌
  • 慎用自增/自减‌:避免在单个表达式中多次修改同一变量(如x = x++ + ++x)‌
  • ‌类型安全优先‌:优先使用as而非显式转换,防止运行时异常‌
  • ‌性能优化‌:利用逻辑运算符的短路特性减少冗余计算‌
相关推荐
Java中文社群3 分钟前
重要:Java25正式发布(长期支持版)!
java·后端·面试
每天进步一点_JL1 小时前
JVM 类加载:双亲委派机制
java·后端
NAGNIP1 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
用户298698530142 小时前
Java HTML 转 Word 完整指南
java·后端
渣哥2 小时前
原来公平锁和非公平锁差别这么大
java
mudtools2 小时前
.NET驾驭Word之力:理解Word对象模型核心 (Application, Document, Range)
c#·.net
渣哥2 小时前
99% 的人没搞懂:Semaphore 到底是干啥的?
java
J2K2 小时前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
kfyty7252 小时前
不依赖第三方,不销毁重建,loveqq 框架如何原生实现动态线程池?
java·架构
美团技术团队2 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法