云计算、AI、云原生、大数据等一站式技术学习平台

网站首页 > 教程文章 正文

2.3C#的运算符和表达式

jxf315 2024-12-04 12:12:50 教程文章 50 ℃

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"

Tags:

最近发表
标签列表