运算符与表达式
算术运算符
算术运算符用于执行基本的数学运算,包括加、减、乘、除和取余。
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
+ |
加 | 5 + 3 |
8 |
- |
减 | 5 - 3 |
2 |
* |
乘 | 5 * 3 |
15 |
/ |
除 | 7 / 2 |
3 |
% |
取余 | 7 % 2 |
1 |
⚠️ 注意: 整数除法会截断小数部分。
7 / 2 结果为 3,而非 3.5。若要得到浮点结果,至少一个操作数须为浮点型,如 7.0 / 2 结果为 3.5。
示例
CSHARP
using System;
class Program
{
static void Main()
{
int a = 17, b = 5;
Console.WriteLine($"加法: {a} + {b} = {a + b}");
Console.WriteLine($"减法: {a} - {b} = {a - b}");
Console.WriteLine($"乘法: {a} * {b} = {a * b}");
Console.WriteLine($"整数除法: {a} / {b} = {a / b}");
Console.WriteLine($"浮点除法: {a * 1.0} / {b} = {a * 1.0 / b}");
Console.WriteLine($"取余: {a} % {b} = {a % b}");
}
}
TEXT
加法: 17 + 5 = 22
减法: 17 - 5 = 12
乘法: 17 * 5 = 85
整数除法: 17 / 5 = 3
浮点除法: 17 / 5 = 3.4
取余: 17 % 5 = 2
自增与自减运算符
自增 ++ 和自减 -- 运算符将变量的值增加或减少 1。前缀形式先改变值再使用,后缀形式先使用再改变值。
| 运算符 | 名称 | 说明 |
|---|---|---|
++x |
前缀自增 | 先加 1,再使用值 |
x++ |
后缀自增 | 先使用值,再加 1 |
--x |
前缀自减 | 先减 1,再使用值 |
x-- |
后缀自减 | 先使用值,再减 1 |
示例
CSHARP
using System;
class Program
{
static void Main()
{
int x = 10;
int y = 10;
Console.WriteLine($"前缀自增: ++x = {++x}, x = {x}");
Console.WriteLine($"后缀自增: y++ = {y++}, y = {y}");
int m = 5;
int n = 5;
Console.WriteLine($"前缀自减: --m = {--m}, m = {m}");
Console.WriteLine($"后缀自减: n-- = {n--}, n = {n}");
}
}
TEXT
前缀自增: ++x = 11, x = 11
后缀自增: y++ = 10, y = 11
前缀自减: --m = 4, m = 4
后缀自减: n-- = 5, n = 4
关系运算符
关系运算符用于比较两个值,返回 bool 类型结果(true 或 false)。
| 运算符 | 名称 | 示例 | 结果 |
|---|---|---|---|
== |
等于 | 5 == 5 |
true |
!= |
不等于 | 5 != 3 |
true |
< |
小于 | 3 < 5 |
true |
> |
大于 | 5 > 3 |
true |
<= |
小于等于 | 5 <= 5 |
true |
>= |
大于等于 | 5 >= 6 |
false |
💡 提示: 不要混淆
=(赋值)和 ==(判断相等)。在 if 条件中误用 = 会导致编译错误或逻辑错误。
逻辑运算符
逻辑运算符用于组合布尔表达式。C# 使用 && 和 || 进行短路求值,即当结果已确定时不再计算剩余表达式。
| 运算符 | 名称 | 示例 | 说明 |
|---|---|---|---|
&& |
逻辑与 | a && b |
两者都为 true 则为 true(短路) |
| ` | ` | 逻辑或 | |
! |
逻辑非 | !a |
取反 |
⚠️ 注意: C# 中逻辑运算使用
&& 和 ||,而非 & 和 |。& 和 | 是按位运算符,也可以用于布尔运算但不短路。
示例
CSHARP
using System;
class Program
{
static void Main()
{
int age = 25;
bool hasLicense = true;
bool canDrive = age >= 18 && hasLicense;
Console.WriteLine($"可以驾车: {canDrive}");
bool isWeekend = false;
bool isHoliday = true;
bool dayOff = isWeekend || isHoliday;
Console.WriteLine($"休息日: {dayOff}");
bool isRaining = true;
Console.WriteLine($"没下雨: {!isRaining}");
}
}
TEXT
可以驾车: True
休息日: True
没下雨: False
赋值运算符
赋值运算符用于将值赋给变量。复合赋值运算符将运算和赋值合并为一步。
| 运算符 | 等价写法 | 示例 |
|---|---|---|
= |
x = 10 |
|
+= |
x = x + y |
x += 5 |
-= |
x = x - y |
x -= 3 |
*= |
x = x * y |
x *= 2 |
/= |
x = x / y |
x /= 4 |
%= |
x = x % y |
x %= 3 |
条件运算符
条件运算符 ?: 是 C# 中唯一的三元运算符,根据条件返回两个值中的一个。
语法:condition ? valueIfTrue : valueIfFalse
示例
CSHARP
using System;
class Program
{
static void Main()
{
int score = 72;
string result = score >= 60 ? "及格" : "不及格";
Console.WriteLine($"成绩 {score} 分: {result}");
int a = 15, b = 9;
int max = a > b ? a : b;
Console.WriteLine($"较大值: {max}");
}
}
TEXT
成绩 72 分: 及格
较大值: 15
null 合并运算符
?? 运算符在左侧操作数为 null 时返回右侧操作数的值,否则返回左侧值。??= 运算符(C# 8)是 null 合并赋值运算符,仅在变量为 null 时赋值。
CSHARP
using System;
class Program
{
static void Main()
{
string name = null;
string display = name ?? "匿名用户";
Console.WriteLine($"名称: {display}");
int? count = null;
int total = count ?? 0;
Console.WriteLine($"总数: {total}");
string title = null;
title ??= "默认标题";
Console.WriteLine($"标题: {title}");
title ??= "新标题";
Console.WriteLine($"标题: {title}");
}
}
TEXT
名称: 匿名用户
总数: 0
标题: 默认标题
标题: 默认标题
null 条件运算符
?. 运算符在访问成员前检查对象是否为 null。如果对象为 null,表达式直接返回 null,而非抛出 NullReferenceException。
CSHARP
using System;
class Program
{
static void Main()
{
string text = "Hello C#";
Console.WriteLine($"长度: {text?.Length}");
text = null;
Console.WriteLine($"长度: {text?.Length}");
int? len = text?.Length;
Console.WriteLine($"类型: {len?.GetType().Name ?? "null"}");
}
}
TEXT
长度: 8
长度:
类型: null
运算符优先级
下表从高到低列出 C# 常用运算符的优先级,同一行的运算符优先级相同。
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 1 | x++ x-- . ?. () [] |
后缀、成员访问 |
| 2 | ++x --x +x -x ! ~ |
前缀、一元 |
| 3 | * / % |
乘除取余 |
| 4 | + - |
加减 |
| 5 | < > <= >= is as |
关系、类型检查 |
| 6 | == != |
相等 |
| 7 | && |
逻辑与 |
| 8 | ` | |
| 9 | ?? ??= |
null 合并 |
| 10 | ?: |
条件 |
| 11 | = += -= *= /= %= 等 |
赋值 |
💡 提示: 当不确定优先级时,使用括号
() 明确计算顺序,既可避免错误也提高可读性。
❓ 常见问题
Q 整数除法和浮点除法有什么区别?
A 整数除法截断小数部分,如
7 / 2 为 3;浮点除法保留小数,如 7.0 / 2 为 3.5。Q
++x 和 x++ 有何不同?A
++x 先自增再返回新值,x++ 先返回当前值再自增。在单独语句中效果相同,在表达式中结果不同。Q
&& 和 & 有什么区别?A
&& 是短路逻辑与,左侧为 false 时不再计算右侧;& 是按位与,也可用于布尔运算但不短路,始终计算两侧。Q
?? 和 ?. 分别用于什么场景?A
?? 用于提供 null 时的默认值;?. 用于安全访问可能为 null 的对象成员,避免 NullReferenceException。📖 小节
- 算术运算符执行数学计算,注意整数除法截断小数
- 自增自减有前缀和后缀两种形式,区别在于求值时机
- 关系运算符返回
bool值,用于条件判断 - 逻辑运算符
&&和||支持短路求值 - 复合赋值运算符简化了运算并赋值的写法
- 条件运算符
?:是简洁的三元选择表达式 ??提供 null 默认值,?.安全访问成员,??=在 null 时赋值- 优先级从高到低依次为:后缀 → 一元 → 乘除 → 加减 → 关系 → 相等 → 逻辑与 → 逻辑或 → null合并 → 条件 → 赋值
📝 作业
- 编写程序,计算
7 / 2和7.0 / 2的结果并输出,验证整数除法的截断行为。 - 编写程序,演示
++x和x++在表达式中的区别:令int a = 5,分别计算++a * 3和a++ * 3并输出结果。 - 编写程序,使用条件运算符判断一个整数是正数、零还是负数(可嵌套
?:)。 - 编写程序,创建一个
string变量赋值为null,分别使用??和?.输出其默认值和安全访问长度。 - 编写程序,计算表达式
2 + 3 * 4和(2 + 3) * 4的结果,说明括号对优先级的影响。



