运算符(Operator)就是用来对数据执行运算、比较、判断的符号。参与运算的数据叫做操作数。
例:
int a = 1 + 2;
+:运算符1和2:操作数1 + 2:表达式(Expression),表达式运算后会产生一个结果值。
C# 运算符分类:
- 算术运算符(加减乘除、取余、自增自减)
- 赋值运算符(
=、+=、-=等复合赋值)- 关系(比较)运算符(大于小于等于,返回 bool)
- 逻辑运算符(与、或、非,用于多条件判断)
- 三元运算符(
?:,简单 if 简写)- 其他常用运算符:
is、as、typeof、.成员访问、括号()最后:运算符优先级(⭐重点,新手极易出错)
学习思路:逐个学习,看示例,拆解机理,区分容易踩坑点,最后掌握优先级。
1. 算术运算符
用于数值计算,操作数一般是 int、double、decimal 等数字类型。
| 符号 | 名称 | 作用 |
|---|---|---|
+ | 加 | 求和 |
- | 减 | 求差 |
* | 乘 | 求积 |
/ | 除 | 求商 |
% | 取余(模) | 求除法余数 |
++ | 自增 | 变量 + 1 |
-- | 自减 | 变量 - 1 |
示例 1:加减乘除,整数除法大坑
using System; namespace OperatorDemo { class Program { static void Main(string[] args) { int a = 5; int b = 2; Console.WriteLine(a + b); //7 Console.WriteLine(a - b); //3 Console.WriteLine(a * b); //10 Console.WriteLine(a / b); //⭐重点!输出2,不是2.5 } } }机理拆解
a和b都是 int 整数,整数除以整数,结果仍然是 int,直接舍弃小数部分,不四舍五入。 想要得到小数结果,必须把其中一个操作数转为浮点类型:
int a = 5; int b = 2; double res = (double)a / b; Console.WriteLine(res); //输出2.5原理:
(double)a把 a 转为 double,b会隐式转换成 double,变成浮点除法。
示例 2:取余 % 模运算
int a = 7; int b = 3; Console.WriteLine(a % b); //1,7除以3商2,余数1✅ 常用场景:
- 判断数字奇偶:
num % 2 == 0偶数; - 循环周期,比如每 5 个换行。
int num = 4; Console.WriteLine(num % 2); //0 → 偶数示例 3:自增 ++ 、自减 --(前 ++ 和后 ++ 核心难点)
++:变量自身 +1;--:变量自身 -1。
- 后置
i++:先使用变量原值参与运算,运算结束后变量 + 1- 前置
++i:变量先 + 1,再使用新值参与运算
static void Main() { int i = 10; int res1 = i++; //后置++ Console.WriteLine($"res1={res1}, i={i}"); // res1=10,i=11 int j = 10; int res2 = ++j; //前置++ Console.WriteLine($"res2={res2}, j={j}"); // res2=11,j=11 }机理拆解
int res1 = i++;- 第一步:把 i 当前的值 10 拿出来,赋值给 res1;
- 第二步:i 自增,i 变成 11。
int res2 = ++j;- 第一步:j 自增变成 11;
- 第二步:把 j 新值 11 赋值给 res2。
单独一行写
i++;和++i;效果完全一样,没有任何区别。只有在表达式里面参与赋值 / 打印的时候,才会出现差异。
int i = 5; i++; //单独一行,等价 ++i; Console.WriteLine(i); //62. 赋值运算符
=是赋值运算符,不是数学等于号!
=含义:把右边表达式的结果,存入左边变量的内存空间。 ⚠️ 左边必须是变量,不能是数字或者常量。
基础赋值
int a; a = 10; // 将10存入变量a复合赋值运算符(简写)
| 符号 | 等价写法 |
|---|---|
+= | a = a + b |
-= | a = a - b |
*= | a = a * b |
/= | a = a / b |
%= | a = a % b |
示例
static void Main() { int score = 60; score += 10; //等价 score = score + 10; Console.WriteLine(score); //70 score -= 5; Console.WriteLine(score); //65 }复合赋值底层自带隐式类型转换,部分场景可以少写强制转型,新手先记住是简写语法。
3. 关系(比较)运算符
比较两个数据大小、是否相等;运算结果一定是 bool 类型:true /false。
| 符号 | 含义 |
|---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于判断(两个等号!) |
!= | 不等于 |
⚠️ 超级大坑:
=赋值;==判断相等,千万不要写混!
示例
static void Main() { int a = 10; int b = 20; Console.WriteLine(a > b); //false Console.WriteLine(a < b); //true Console.WriteLine(a == 10);//true Console.WriteLine(a != b); //true }机理:拿左右两个操作数对比,满足条件返回 true,不满足返回 false。返回的布尔值,最常用在 if 判断条件。
int age = 18; if(age >= 18) { Console.WriteLine("成年"); }字符串比较:
==可以用来判断字符串内容是否相等
string s1 = "abc"; string s2 = "abc"; Console.WriteLine(s1 == s2); //true4. 逻辑运算符:多个条件组合判断
操作数是 bool 类型(true/false),结果也为 bool。
| 符号 | 名称 | 规则 |
|---|---|---|
&& | 逻辑与(短路与) | 左右都 true,结果才 true;有一个 false 直接 false |
|| | 逻辑或(短路或) | 任意一个 true,结果 true;全 false 才 false |
! | 逻辑非(取反) | true 变 false,false 变 true |
✅
&&和||是短路运算(C# 默认):一旦能确定最终结果,后面表达式不再执行!这是高频考点。
示例 1:逻辑与 &&
int age = 20; int score = 80; bool res = age >= 18 && score >=60; Console.WriteLine(res); //true条件:年龄大于等于 18,并且分数≥60,两个条件同时成立。
短路演示:
int a = 10; bool result = a < 5 && ++a > 0; Console.WriteLine(result); //false Console.WriteLine(a); //10! ++a 根本没有执行!机理:a<5结果是 false,&&只要左边 false,整体一定 false,右边直接跳过不执行,a 不会自增。
示例 2:逻辑或 ||
int score = 95; bool res = score >=90 || score < 60; Console.WriteLine(res); //true只要任意一个条件成立,整体 true。
短路演示:
int a = 10; bool result = a >5 || ++a >0; Console.WriteLine(result); //true Console.WriteLine(a); //10,右边++a不执行左边已经 true,||直接判定整体 true,后面代码不跑。
示例 3:逻辑非!
bool isOk = false; Console.WriteLine(!isOk); //true取反,把真假翻转。常用于取反判断:if(!isStudent)如果不是学生。
补充:
&和|(不短路逻辑运算),新手初学很少用,不管左边结果如何,左右两边全部执行。日常条件判断一律用&&和||。
5. 三元运算符?:
唯一的三元运算符:需要 3 个操作数。 语法模板:
条件表达式 ? 条件为true时的值 : 条件为false时的值;作用:简单 if else 的简写,返回一个结果,适合简单二选一赋值。
示例
static void Main() { int score = 70; string result = score >=60 ? "及格" : "不及格"; Console.WriteLine(result); //及格 }机理拆解
- 先执行问号前面的条件
score >=60; - 如果条件 true,取冒号
:左边的值; - 如果条件 false,取冒号
:右边的值; - 将得到的字符串赋值给 result 变量。
限制:适合简单判断,不要多层嵌套三元运算符,代码可读性会很差。
6. 其他常用运算符简介
.成员访问运算符:访问类的字段、方法
Console.WriteLine("hi"); // .访问Console类的WriteLine方法()括号运算符:提高优先级,改变运算顺序is:判断对象是否属于某个类型,返回 bool
object obj = "123"; if(obj is string) { Console.WriteLine("是字符串"); }as:引用类型安全转换,失败返回 null
object obj = "test"; string str = obj as string;7. 运算符优先级(⭐重中之重)
优先级越高,越先计算。括号
()优先级最高,可以强制改变运算顺序!
从高到低,只列出现阶段常用:
()括号++、--自增自减(前置 / 后置),!取反*/%乘除取余+-加减><>=<=比较==!=相等判断&&逻辑与||逻辑或?:三元运算符=+=-=赋值(优先级最低)
示例:优先级演示
int res = 10 + 2 * 5; Console.WriteLine(res); //20,先算乘法2*5,再加10加括号改变顺序:
int res = (10 + 2) * 5; Console.WriteLine(res); //60,括号优先执行新手建议:不确定优先级的时候,直接加括号,可读性最好,不容易踩坑。
8. 新手高频坑汇总
- 整数 / 整数,结果仍然是整数,直接丢掉小数,不是四舍五入;需要小数,强制转浮点。
=赋值,==相等判断,if 条件里千万不要写成if(a=10)(编译报错或者逻辑错误)。++后置和前置,只有在表达式参与运算时才有区别,单独一行无差别。&&、||短路运算,满足条件后右侧代码不会执行,右侧自增等代码不会跑。- 比较运算符连写错误:
if(10 < a <20)不可以!C# 不能这么写,必须写成if(a>10 && a<20)。 - 优先级不确定,优先加括号,不要凭数学直觉。