c#运算符和表达式

2024-10-04 23:35:00 浏览数 (1)

引言

在C#编程语言中,运算符和表达式是构建程序逻辑的基础。它们允许程序员执行算术、比较、赋值等操作。深入理解运算符和表达式的使用对于编写高效、可读和可维护的代码至关重要。本文将详细探讨C#中的运算符和表达式,包括它们的分类、用法以及一些高级特性。

运算符

运算符是用于执行操作的符号。C#提供了多种运算符,可以分为以下几类:

算术运算符

算术运算符用于执行基本的数学运算。

  • 加法:
  • 减法:-
  • 乘法:*
  • 除法:/
  • 取模:%
  • 整除:/
  • 幂:^

赋值运算符

赋值运算符用于将值赋给变量。

  • 简单赋值:=
  • 复合赋值: =, -=, *=, /=, %=

比较运算符

比较运算符用于比较两个值。

  • 等于:==
  • 不等于:!=
  • 大于:>
  • 小于:<
  • 大于等于:>=
  • 小于等于:<=

逻辑运算符

逻辑运算符用于执行布尔逻辑运算。

  • 逻辑与:&&
  • 逻辑或:||
  • 逻辑非:!

位运算符

位运算符在二进制级别上操作整数。

  • 按位与:&
  • 按位或:|
  • 按位异或:^
  • 按位非:~
  • 左移:<<
  • 右移:>>

其他运算符

C#还提供了一些其他类型的运算符。

  • 三元条件运算符:?:
  • 索引运算符:[]
  • 成员访问运算符:.->
  • 强制类型转换运算符:()
  • 可空运算符:?.?[]

表达式

表达式是由变量、常量、运算符和函数调用组成的组合,它们可以计算出一个值。

算术表达式

代码语言:javascript复制
int result = 5   3 * 2; // 结果为11

赋值表达式

代码语言:javascript复制
int a = 10;
int b = a; // b的值为10

条件表达式

代码语言:javascript复制
int max = (a > b) ? a : b; // 如果a大于b,则max为a的值,否则为b的值

调用表达式

代码语言:javascript复制
int factorial = CalculateFactorial(5); // 调用函数CalculateFactorial

运算符优先级

在没有括号的情况下,运算符的优先级决定了表达式中运算的顺序。

  • 括号 ()
  • ^
  • 负号 -(一元运算符)
  • 乘法 *, 除法 /, 取模 %
  • 加法 , 减法 -
  • 移位 <<, >>
  • 按位与 &
  • 按位异或 ^
  • 按位或 |
  • 逻辑与 &&
  • 逻辑或 ||
  • 条件运算符 ?:
  • 赋值运算符 =, =, -=, 等等

运算符重载

C#允许开发者重载运算符,以自定义类或结构体的运算符行为。

代码语言:javascript复制
public class Complex
{
    public double Real { get; set; }
    public double Imaginary { get; set; }

    public static Complex operator  (Complex c1, Complex c2)
    {
        return new Complex
        {
            Real = c1.Real   c2.Real,
            Imaginary = c1.Imaginary   c2.Imaginary
        };
    }
}

表达式树

表达式树是用于表示代码中表达式的树状数据结构。它们在LINQ查询和动态方法调用中非常有用。

代码语言:javascript复制
Expression<Func<int, bool>> expression = x => x > 10;

匿名函数

匿名函数是一种没有名称的函数,通常用于委托和表达式树。

代码语言:javascript复制
Func<int, bool> func = x => x > 10;

运算符和表达式的高级用法

条件运算符

条件运算符是一种简洁的三元运算符,用于基于条件表达式计算两个值中的一个。

代码语言:javascript复制
int max = (a > b) ? a : b;

运算符优先级和括号

正确使用括号可以改变运算符的默认优先级,确保表达式按照预期执行。

代码语言:javascript复制
int result = (5   3) * 2; // 结果为16

运算符重载

运算符重载允许自定义类型的行为,使其可以像内置类型一样使用运算符。

代码语言:javascript复制
public class Vector2D
{
    public double X { get; set; }
    public double Y { get; set; }

    public static Vector2D operator  (Vector2D v1, Vector2D v2)
    {
        return new Vector2D { X = v1.X   v2.X, Y = v1.Y   v2.Y };
    }
}

表达式树

表达式树是构建复杂查询和动态执行代码的强大工具。

代码语言:javascript复制
var query = from num in numbers
            where num > 5
            select num;

匿名函数

匿名函数提供了一种方便的方式来创建简短的函数,通常用于委托和事件。

代码语言:javascript复制
int[] numbers = { 1, 2, 3, 4, 5 };
var evenNumbers = numbers.Where(n => n % 2 == 0);

0 人点赞