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而非显式转换,防止运行时异常‌
  • ‌性能优化‌:利用逻辑运算符的短路特性减少冗余计算‌
相关推荐
AndrewHZ14 分钟前
【python与生活】如何用Python写一个简单的自动整理文件的脚本?
开发语言·python·生活·脚本·文件整理
拉法豆粉17 分钟前
在压力测试中如何确定合适的并发用户数?
java·开发语言
枯萎穿心攻击35 分钟前
Unity VS UE 性能工具与内存管理
开发语言·游戏·unity·ue5·游戏引擎·虚幻·虚幻引擎
爱上纯净的蓝天1 小时前
迁移面试题
java·网络·c++·pdf·c#
老赵的博客1 小时前
c++ 常用接口设计
开发语言·c++
binbinaijishu881 小时前
Python爬虫入门指南:从零开始的网络数据获取之旅
开发语言·爬虫·python·其他
chenglin0161 小时前
Logstash_Input插件
java·开发语言
3壹1 小时前
单链表:数据结构中的高效指针艺术
c语言·开发语言·数据结构
单单单单点2 小时前
C# 相机内存复用(减少图像采集耗时)以及行数复用
图像处理·计算机视觉·c#·相机
bemyrunningdog2 小时前
Spring文件上传核心技术解析
java