网站首页 > 教程文章 正文
C#的运算符和表达式
C#是一种强类型的面向对象的编程语言,它提供了丰富的运算符和表达式来操作数据和控制程序流程。本文将介绍C#中常用的运算符和表达式的概念和用法,以及一些注意事项和示例。
运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C#有多种类型的运算符,可以分为以下几类:
- 算术运算符,用于对数值类型的操作数执行基本的加减乘除等操作。
- 关系运算符,用于比较两个操作数的大小或相等性。
- 逻辑运算符,用于对布尔类型的操作数执行逻辑与或非等操作。
- 位运算符,用于对整数类型的操作数执行按位与或异或等操作。
- 赋值运算符,用于给变量或属性赋值或修改值。
- 其他运算符,包括一元运算符、条件运算符、null合并运算符、lambda运算符等。
不同类型的运算符有不同的优先级和结合性,这决定了表达式中运算符的执行顺序。一般来说,优先级高的运算符先执行,优先级相同的运算符按照结合性从左到右或从右到左执行。可以使用括号来改变默认的执行顺序。
下表列出了C#中常用的运算符及其优先级和结合性1:
运算符 | 类别或名称 | 优先级 | 结合性 |
x.y, f(x), a[i], x?.y, x?[y], x++, x–, x!, new, typeof, checked, unchecked, default, nameof, delegate, sizeof, stackalloc, x->y | 主要 | 最高 | 左 |
+x, -x, !x, ~x, ++x, --x, ^x, (T)x, await, &&x, *x, true 和 false | 一元 | 次高 | 右 |
x…y | 范围 | 次高 | 左 |
switch, with | switch 和 with 表达式 | 次高 | 右 |
x * y, x / y, x % y | 乘法 | 高 | 左 |
x + y, x – y | 加法 | 中高 | 左 |
x << y, x >> y | 移位 | 中高 | 左 |
x < y, x > y, x <= y, x >= y, is, as | 关系和类型测试 | 中低 | 左 |
x == y, x != y | 相等 | 低 | 左 |
x & y | 布尔逻辑 AND 或 按位逻辑 AND | 低 | 左 |
x ^ y | 布尔逻辑 XOR 或 按位逻辑 XOR | 低中 | 左 |
x | y | 布尔逻辑 OR 或 按位逻辑 OR | 低中 | 左 |
x && y | 条件“与” | 低中低 | 左 |
x || y | 条件“或” | 低中低低 | 左 |
x ?? y | Null 合并运算符 | 最低中高高 |
条件运算符
条件运算符 ( ?:) 也称为三元条件运算符,用于根据一个布尔表达式的结果返回两个表达式中的一个。它是C#中唯一的三元运算符,也是一种简化if-else语句的方式。条件运算符的语法如下:
condition ? consequent : alternative
其中,condition是一个布尔表达式,consequent和alternative是两个表达式,它们的类型必须相同或可以隐式转换为目标类型。如果condition的结果为true,那么返回consequent的值,否则返回alternative的值。例如:
int a = 10;
int b = 20;
int max = a > b ? a : b; // max = 20
string s = null;
string t = s ?? "default"; // t = "default"
条件运算符可以嵌套使用,但要注意使用括号来明确优先级和可读性。例如:
int x = 10;
int y = 20;
int z = 30;
int max = x > y ? (x > z ? x : z) : (y > z ? y : z); // max = 30
从C# 7.2开始,可以使用ref条件表达式有条件地分配ref local或ref readonly local变量。还可以使用ref条件表达式作为引用返回值或ref方法参数。ref条件表达式的语法如下:
condition ? ref consequent : ref alternative
其中,condition是一个布尔表达式,consequent和alternative是两个ref或out变量,它们的类型必须相同。如果condition的结果为true,那么返回consequent的引用,否则返回alternative的引用。例如:
var smallArray = new int[] { 1, 2, 3, 4, 5 };
var largeArray = new int[] { 10, 20, 30, 40, 50 };
int index = 7;
ref int refValue = ref ((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]);
refValue = 0;
index = 2;
((index < 5) ? ref smallArray[index] : ref largeArray[index - 5]) = 100;
Console.WriteLine(string.Join(" ", smallArray));
Console.WriteLine(string.Join(" ", largeArray));
// Output:
// 1 2 100 4 5
// 10 20 0 40 50
条件运算符和if语句
需要根据条件计算值时,使用条件运算符而不是if语句可以使代码更简洁。下面的示例演示了将整数归类为负数或非负数的两种方法:
int input = new Random().Next(-5, 5);
string classify;
if (input >= 0)
{
classify = "nonnegative";
}
else
{
classify = "negative";
}
classify = (input >= 0) ? "nonnegative" : "negative";
运算符可重载性
用户定义类型不能重载条件运算符。
表达式
表达式是一种由操作数和运算符组成的代码片段,它可以计算出一个值。C#中有多种类型的表达式,例如字面量、变量、方法调用、运算符表达式、lambda表达式、查询表达式等。表达式可以嵌套在其他表达式中,形成复杂的表达式。例如:
int x = 10;
int y = 20;
int z = x + y * 2; // 复杂的表达式
Console.WriteLine(z); // 输出 50
表达式的计算顺序由运算符的优先级和结合性决定。优先级高的运算符先计算,优先级相同的运算符按照结合性从左到右或从右到左计算。可以使用括号来改变默认的计算顺序。例如:
int x = 10;
int y = 20;
int z = (x + y) * 2; // 使用括号改变计算顺序
Console.WriteLine(z); // 输出 60
有些运算符有条件地计算操作数,也就是说,它们根据第一个操作数的值决定是否需要计算第二个操作数。这些运算符包括条件逻辑与运算符 (&&)、条件逻辑或运算符 (||) 和 null合并运算符 (??)。例如:
bool a = false;
bool b = true;
bool c = a && b; // 因为 a 为 false,所以不需要计算 b,结果为 false
bool d = a || b; // 因为 a 为 false,所以需要计算 b,结果为 true
string s = null;
string t = s ?? "default"; // 因为 s 为 null,所以需要计算 "default",结果为 "default"
- 上一篇: C#_设置IP地址
- 下一篇: 【C#基础语法】七、运算符与表达式 - 逻辑运算符
猜你喜欢
- 2024-12-04 C#最常用的语法和方法(备用查询)
- 2024-12-04 C# 高级编程——委托
- 2024-12-04 运算符 - C#入门教程
- 2024-12-04 学习笔记之C#基础——变量与常量
- 2024-12-04 C# 入门深度学习:万字长文讲解微积分和梯度下降
- 2024-12-04 如何使用 C# 扩展方法
- 2024-12-04 9.C#关系运算符与逻辑运算符
- 2024-12-04 一个“txt文档”,就可以偷光你的秘密
- 2024-12-04 C#之委托
- 2024-12-04 C#+web=?微软Blazor
- 最近发表
- 标签列表
-
- location.href (44)
- document.ready (36)
- git checkout -b (34)
- 跃点数 (35)
- 阿里云镜像地址 (33)
- qt qmessagebox (36)
- md5 sha1 (32)
- mybatis plus page (35)
- semaphore 使用详解 (32)
- update from 语句 (32)
- vue @scroll (38)
- 堆栈区别 (33)
- 在线子域名爆破 (32)
- 什么是容器 (33)
- sha1 md5 (33)
- navicat导出数据 (34)
- 阿里云acp考试 (33)
- 阿里云 nacos (34)
- redhat官网下载镜像 (36)
- srs服务器 (33)
- pico开发者 (33)
- https的端口号 (34)
- vscode更改主题 (35)
- 阿里云资源池 (34)
- os.path.join (33)