C# 运算符

总目录


前言

在C#中,运算符是用于执行特定操作的符号。它们可以用于处理变量、常量或其他表达式。C# 提供了丰富的运算符集合,用于执行各种操作,如算术运算、逻辑判断、位操作等。了解这些运算符及其使用方式对于编写高效且功能强大的C#程序至关重要。


一、算术运算符

算术运算符用于执行基本的数学运算,如加法、减法、乘法、除法和取模。

1. 算术运算符概览

运算符描述示例结果
+加法a + b5 + 3 = 8
-减法a - b5 - 3 = 2
*乘法a * b5 * 3 = 15
/除法a / b5 / 2 = 2
%取模(求余数)a % b21%10=1
++自增(前缀或后缀)a++
++a
a = a + 1
- -自减(前缀或后缀)a--
--a
a = a - 1

2. 注意事项

  • 溢出检查:算术运算可能溢出,可用checked检查溢出。
  • + 加法运算符:用于两个字符串或字符串与数值类时,是拼接字符串
    • string s = “Hello” + “World”; // “HelloWorld”
    • string s = “Hello” + 1; // “Hello1”
  • /除法运算符 :运算结果取决于操作数的类型
    • 当两个操作数均为整数的时候,进行取商运算,结果为整数(舍弃小数部分);
    • 当两边有一个为浮点型的时候,进行精确运算,结果为浮点数;
    • (double)7 / 23.5;避免除0错误(抛出DivideByZeroException
  • %取模运算符 :用于获取除法运算的余数
    • 可用于判断奇偶、周期性操作
  • ++自增/自减运算符:增量和减量运算符用于将变量的值增加或减少1。
    • 当自增/自减运算符在前(形如 ++a),则先自增,再赋值;
    • 当自增/自减运算符在后(形如 a++),则先赋值,再自增;
  • char类型:在char类型参与到算术运算时,会自动转化为ascii码10进制的值参与运算

3. 示例

int a = 5;
int b = 2;

int sum = a + b;   // 7
int diff = a - b;  // 3
int product = a * b; // 10
int quotient = a / b; // 2
int remainder = a % b; // 1

Console.WriteLine($"Sum: {sum}, Diff: {diff}, Product: {product}, Quotient: {quotient}, Remainder: {remainder}");
	class Program
    {
        static void Main(string[] args)
        {
            int a = 1;
            int b;

            // a++ 先赋值再进行自增运算
            b = a++;
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
            Console.ReadLine();//结果a=2,b=1

            // ++a 先进行自增运算再赋值
            a = 1; // 重新初始化 a
            b = ++a;
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
            Console.ReadLine();//结果a=2,b=2

            // a-- 先赋值再进行自减运算
            a = 1;  // 重新初始化 a
            b= a--;
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
            Console.ReadLine();//结果a=0,b=1

            // --a 先进行自减运算再赋值
            a = 1;  // 重新初始化 a
            b= --a;
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
            Console.ReadLine();//结果a=0,b=0
        }
    }

二、赋值运算符

赋值运算符用于将值赋给变量。C#提供了多种赋值运算符,包括简单赋值和复合赋值运算符。

1. 赋值运算符概览

在这里插入图片描述

  • 基本赋值
    • = 简单赋值
  • 复合赋值
    • += 加法赋值
    • -= 减法赋值
    • *= 乘法赋值
    • /= 除法赋值
    • %= 模赋值

2. 示例

int x = 10;
x += 5; // 相当于 x = x + 5; 结果是15
int a = 5;
a += 3;  // a = a + 3 => a = 8
a -= 2;  // a = a - 2 => a = 6
a *= 2;  // a = a * 2 => a = 12
a /= 3;  // a = a / 3 => a = 4
a %= 2;  // a = a % 2 => a = 0

Console.WriteLine($"a = {a}");

三、比较/关系运算符

比较/关系运算符用于比较两个值的大小或相等性。它们返回布尔值(true 或 false)。常用于判断语句中。

1. 关系运算符概览

运算符描述示例结果
==等于a == b5 == 3 返回 false
!=不等于a != b5 != 3 返回 true
>大于a > b5 > 3 返回 true
<小于a < b5 < 3 返回 false
>=大于等于a >= b5 >= 3 返回 true
<=小于等于a <= b5 <= 3 返回 false

注:关系运算符的运算结果均是bool ,常运用于判断语句中

2. 示例

int m = 10, n = 20;
Console.WriteLine(m < n); // 输出: True
int a = 5;
int b = 3;

bool isEqual = a == b;  // false
bool isNotEqual = a != b; // true
bool isGreater = a > b;  // true
bool isLess = a < b;     // false

Console.WriteLine($"isEqual: {isEqual}, isNotEqual: {isNotEqual}, isGreater: {isGreater}, isLess: {isLess}");

四、逻辑运算符

逻辑运算符用于对布尔值进行逻辑操作,如与(AND)、或(OR)、非(NOT)。
用于在条件语句中组合多个条件。

1. 逻辑运算符概览

运算符描述示例结果
||逻辑或(||)ORa||btrue || false 返回 true

当两个操作数均为false ,则结果为false,其余均为true
&&逻辑与(&& )ANDa&&btrue && false 返回 false

当两个操作数均为true,则结果为true,其余均为false
!逻辑非(! )NOT!a!true 返回 false

取反

2. 注意事项

  • 短路求值
    • 在逻辑与(&&)中,如果第一个操作数为false,则不会计算第二个操作数。
    • 在逻辑或(||)中,如果第一个操作数为true,则不会计算第二个操作数。
    • 例如,当&&运算符左边为false的时候,此时无论运算符右边是什么,结果都为false,那么右边表达式就不会运行。
  • 避免短路
    • 单独使用|& 就不会产生短路的效果,即使左边已经起了决定性作用,右边仍会运行。

3. 示例

bool isSunny = true, isWarm = false;
Console.WriteLine(isSunny && !isWarm); // 输出: True
bool a = true;
bool b = false;

bool andResult = a && b; // false
bool orResult = a || b;  // true
bool notResult = !a;     // false

Console.WriteLine($"andResult: {andResult}, orResult: {orResult}, notResult: {notResult}");

五、位运算符

位运算符用于对整数的二进制位进行操作。它们在底层操作中非常高效。

1. 位运算符概览

在这里插入图片描述

运算符描述示例结果(二进制)
&按位与(AND)a & b当两个操作数均为1 ,则结果为1,其余均为0

5 & 3 => 101 & 011 = 001 = 1
|按位或(OR)a | b当两个操作数均为0,则结果为0,其余均为1

5 | 3=>101 | 011=111=7
^按位异或(XOR)a ^ b当两个操作均为0或1,则结果为0,其余结果为1

5 ^ 3 => 101 ^ 011 = 110 = 6
~按位取反(NOT)~a具有翻转位的效果,可将0变1,1变0

~5 => ~101 = 010 = -6(补码)
<<左移a << 1左操作数的值向左移动右操作数的位数

5 << 1 => 1010 = 10
>>右移a >> 1左操作数的值向右移动右操作数指定的位数

5 >> 1 => 010 = 2

2. 示例

		static void Main(string[] args)
        {
            //60 和13 转换位二进制分别是111100 和 1101 ,不足8位【前面】使用0补足
            int a = 60;            /* 60 = 0011 1100 */
            int b = 13;            /* 13 = 0000 1101 */
            int c = 0;

            c = a & b;
            // a      0011 1100
            // b      0000 1101
            //-----------------   根据&运算符规则:只有均为1的时候,结果才为1,否则均为0
            // c      0000 1100===>转换为十进制 则是12
            Console.WriteLine("Line 1 - c 的值是 {0}", c);

            c = a | b;
            // a      0011 1100
            // b      0000 1101
            //-----------------   根据|运算符规则:只有均为0的时候,结果才为0,否则均为1
            // c      0011 1101===>转换为十进制 则是61
            Console.WriteLine("Line 2 - c 的值是 {0}", c);

            c = a ^ b;
            // a      0011 1100
            // b      0000 1101
            //-----------------   根据^运算符规则:只有均为0或1的时候,结果才为0,否则均为1
            // c      0011 0001===>转换为十进制 则是49
            Console.WriteLine("Line 3 - c 的值是 {0}", c);

            c = ~a;               /*-61 = 1100 0011 */
            // a      0011 1100
            //取反-----------------   根据~运算符规则:将0变1 ,1变0
            // c      1100 0011===>转换为十进制 则是-61
            Console.WriteLine("Line 4 - c 的值是 {0}", c);

            c = a << 2;   
            // a      0011 1100
            //左移-----------------  0011 1100 向左移动两位则将前面两位00 移掉了,然后后面补足两位00
            // c      1111 0000===>转换为十进制 则是240
            Console.WriteLine("Line 5 - c 的值是 {0}", c);

            c = a >> 2;
            // a      0011 1100
            //右移-----------------  0011 1100 向右移动两位则将后面两位00 移掉了,然后前面补足两位00
            // c      0000 1111===>转换为十进制 则是15
            Console.WriteLine("Line 6 - c 的值是 {0}", c);
            Console.ReadLine();
        }

六、其他运算符

1. 条件运算符(?:)

条件运算符是一种简化的if-else语句,用于根据条件返回两个值中的一个。

语法:

条件表达式 ? 表达式1 : 表达式2
  • 如果条件表达式为true,则返回表达式1的值。
  • 如果条件表达式为false,则返回表达式2的值。

示例:

int age = 20;
string result = (age >= 18) ? "Adult" : "Minor";
Console.WriteLine(result); // 输出: Adult
int a = 5;
int b = 3;

int max = (a > b) ? a : b; // 如果 a > b,则 max = a,否则 max = b

Console.WriteLine($"Max: {max}");

2. 类型转换运算符

类型转换运算符用于将一个类型的值转换为另一个类型。C#提供了隐式类型转换和显式类型转换。

  • 隐式类型转换:自动将低精度类型转换为高精度类型,不会丢失数据。

    int a = 5;
    double b = a; // 隐式转换:int 转换为 double
    
  • 显式类型转换:需要使用强制类型转换,可能会丢失数据。

    double d = 10.5;
    int i = (int)d; // 将double转换为int,结果是10
    Console.WriteLine(i);
    

3. is 运算符

is 运算符检查表达式的结果是否与给定的类型相匹配。

 	public class Base { }
    public class Derived : Base { }
    class Program
    {
        static void Main(string[] args)
        {
            // 基类和派生类 之间的is 类型检查
            var b = new Base();
            Console.WriteLine(b is Base);//True
            Console.WriteLine(b is Derived);//False

            var d = new Derived();
            Console.WriteLine(d is Base);//True
            Console.WriteLine(d is Derived);//True

            //派生类可以是基类类型,is 检查返回True 
            //基类不可以是派生类的类型;
            //这个道理就像:兔子,狮子,小狗都可以用动物称呼,但是说所有动物都是小狗那就不行了

            //is 运算符将考虑装箱和取消装箱转换,但不会考虑数值转换
            int i = 27;
            object iBoxed = i;
            Console.WriteLine(iBoxed is int);  // output: True
            Console.WriteLine(iBoxed is long);  // output: False

            object obj = 99.9;
            if (obj is string s)
            {
                Console.WriteLine("结果:"+s);
            }
            if (obj is double score)
            {
                Console.WriteLine("结果:" + score);
            }
            //以上案例说明:is的本质是 检查类型,通过检查返回True,反之,False
            
            //检查是否为null
            if (obj is null)
            {
                Console.WriteLine("**********");
            }

            //检查是否为非null
            if (obj is not null)
            {
                Console.WriteLine("**********");
            }
            Console.ReadLine();
        }
    }

4. as 运算符

as运算符将表达式显式转换为给定类型(如果其运行时类型与该类型兼容)
如果无法进行转换,则 as 运算符返回 null(as不能用于值类型,值类型不能为null)。
与强制转换表达式(形如(int)12) 不同,as 运算符永远不会引发异常。

			object obj1 = "121212";
            int le1 = (obj1 as string).Length;//可以转换

            object obj2 = null;
            int le2 = (obj2 as string).Length;//可以转换,但是由于转换后值为null,因此运行时会报错

            object obj3 = new object();
            string sr = obj as string;
            if (sr == null)
            {
                Console.WriteLine("转换失败");
            }
            else
            { 
                Console.WriteLine("转换成功");
            }
            //使用 as 转换的时候需要注意,转为结果为null的情况

            //is 对比 as 
            if (obj3 is string str3)
            {
                Console.WriteLine($"转换成功{str3}");
            }
            else
            {
                Console.WriteLine($"转换失败");
            }

5. typeof运算符

typeof运算符获取某个类型的 System.Type 实例。

public class Animal { }

public class Giraffe : Animal { }

public static class TypeOfExample
{
    public static void Main()
    {
        object b = new Giraffe();
        Console.WriteLine(b is Animal);  // output: True
        Console.WriteLine(b.GetType() == typeof(Animal));  // output: False

        Console.WriteLine(b is Giraffe);  // output: True
        Console.WriteLine(b.GetType() == typeof(Giraffe));  // output: True
    }
}

四、运算符优先级

1. 优先级

以下是C#中常见运算符的优先级(从高到低):

  1. 括号:()
  2. 一元运算符:++、–、+(正号)、-(负号)、!、~
  3. 乘除取模:*、/、%
  4. 加减:+、-
  5. 位移:<<、>>
  6. 关系运算符:<、>、<=、>=
  7. 相等性:==、!=
  8. 位与:&
  9. 位异或:^
  10. 位或:|
  11. 逻辑与:&&
  12. 逻辑或:||
  13. 条件运算符:? :
  14. 赋值运算符:=, +=, -=, *=, /=, %= 等
  15. 逗号运算符:,

辅助理解的案例代码如下:

//算术运算符和赋值运算符的优先级:
int a = 10, b = 5, c = 2;
a += b * c;               // 先计算乘法,再执行加法赋值
Console.WriteLine(a);       // 输出20

//逻辑运算符的优先级:
bool a = true, b = false, c = true;
bool result = a || b && c;  // 先计算与运算,再计算或运算
Console.WriteLine(result);  // 输出true

//条件运算符的优先级:
int a = 10, b = 5;
string result = a > b ? "a大于b" : "a不大于b";  // 先判断大小关系,再执行条件语句
Console.WriteLine(result);  // 输出"a大于b"

2. 优先级与常见问题

  1. 运算符优先级(从高到低):

    • 括号() > 单目运算符(!, ++, --, ~)> 算术运算符 > 移位 > 比较 > 逻辑与/或 > 条件运算符?: > 赋值运算符。
  2. 易错点

    • 整数除法陷阱5 / 2结果为2,需显式转换为浮点类型。
    • 值类型与引用类型比较==行为不同,需重写Equals方法。
    • 短路逻辑&&||可能跳过部分运算,避免副作用代码在右侧。

结语

回到目录页:C#/.NET 知识汇总
希望以上内容可以帮助到大家,如文中有不对之处,还请批评指正。


参考资料:
算术运算符(C# 参考)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969665.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为AI聊天工具添加一个知识系统 之103 详细设计之44 自性三藏 之4 祖传代码 之2

本文要点 要点 前面的所有讨论都是为了给出我的设计项目&#xff08;为使用AI聊天工具的聊天者 开挂一个知识系统&#xff09; 的祖传代码 的完整设计&#xff0c;其中 的“槽”&#xff08;占位符变量&#xff09;的 库元&#xff08;宝性和自性creator -本俱 替换内容标准模…

wireshark网络抓包

由于图片和格式解析问题&#xff0c;可前往 阅读原文 到这里已经讲了两个抓包工具的使用了&#xff0c;大家应该对抓包不是很陌生了。而wireshark相对于fiddler和charles更加偏向于网络层面的抓包或者说是一个网络封包分析工具。使用对象更适合于网络相关人员(网络管理员/相关运…

深入理解Linux网络随笔(一):内核是如何接收网络包的(下篇)

3、接收网络数据 3.1.1硬中断处理 数据帧从网线到达网卡时候&#xff0c;首先到达网卡的接收队列&#xff0c;网卡会在初始化时分配给自己的RingBuffer中寻找可用内存位置&#xff0c;寻找成功后将数据帧DMA到网卡关联的内存里&#xff0c;DMA操作完成后&#xff0c;网卡会向…

新版电脑通过wepe安装系统

官方下载链接 WIN10下载 WIN11下载 微PE 启动盘制作 1&#xff1a;选择启动盘的设备 2&#xff1a;选择对应的U盘设备&#xff0c;点击安装就可以&#xff0c;建议大于8g 3&#xff1a;在上方链接下载需要安装的程序包&#xff0c;放入启动盘&#xff0c;按需 更新系统 …

蓝桥杯之KMP算法

算法思想 代码实现 int* getnext() {int* next new int[s2.size()];int j 0;//用来遍历子串int k -1;//子串中公共子串的长度next[0] -1;while (j < s2.size() - 1){if (k-1||s2[k] s2[j]){k;j;if (s2[k] s2[j]){next[j] next[k];}else{next[j] k;}}else{k next[k…

jsp页面跳转失败

今天解决一下jsp页面跳转失败的问题 在JavaWeb的学习过程中&#xff0c;编写了这样一段代码&#xff1a; <html> <body> <h2>Hello World!</h2><%--这里提交的路径&#xff0c;需要寻找到项目的路径--%> <%--${pageContext.request.context…

如何实现对 ELK 各组件的监控?试试 Metricbea

上一章基于 Filebeat 的日志收集使用Filebeat收集文件中的日志&#xff0c;而Metricbeat则是收集服务器存活性监测和系统指标的指标。 1. Filebeat和Metricbeat的区别 特性FilebeatHeartbeat作用收集和转发日志监测服务可用性数据来源服务器上的日志文件远程主机、API、服务主…

DeepSeek-VL2 环境配置与使用指南

DeepSeek-VL2 环境配置与使用指南 DeepSeek-VL2 是由 DeepSeek 公司开发的一种高性能视觉-语言模型&#xff08;VLM&#xff09;。它是 DeepSeek 系列多模态模型中的一个版本&#xff0c;专注于提升图像和文本之间的交互能力。 本文将详细介绍如何配置 DeepSeek-VL2 的运行环…

Golang的并发编程问题解决思路

Golang的并发编程问题解决思路 一、并发编程基础 并发与并行 在计算机领域&#xff0c;“并发”和“并行”经常被混为一谈&#xff0c;但它们有着不同的含义。并发是指一段时间内执行多个任务&#xff0c;而并行是指同时执行多个任务。在 Golang 中&#xff0c;通过 goroutines…

多能互补综合能源系统,改变能源结构---安科瑞 吴雅芳

多能互补综合能源系统是一种通过整合多种能源的形势&#xff08;如电力、天然气、热能、冷能等&#xff09;和多种能源技术&#xff08;如可再生能源、储能技术、智能电网等&#xff09;&#xff0c;实现能源利用和配置调整的系统。其目标是通过多能互补和协同优化&#xff0c;…

Linux部署DeepSeek r1 模型训练

之前写过一篇windows下部署deepseekR1的文章&#xff0c;有小伙伴反馈提供一篇linux下部署DeepSeek r1 模型训练教程&#xff0c;在 Linux 环境下&#xff0c;我找了足够的相关资料&#xff0c;花费了一些时间&#xff0c;我成功部署了 DeepSeek R1 模型训练任务&#xff0c;结…

使用pyCharm创建Django项目

使用pyCharm创建Django项目 1. 创建Django项目虚拟环境&#xff08;最新版版本的Django) 使用pyCharm的创建项目功能&#xff0c;选择Django,直接创建。 2. 创建Django项目虚拟环境&#xff08;安装特定版本&#xff09; 2.1创建一个基础的python项目 2.2 安装指定版本的D…

基于vue3实现的课堂点名程序

设计思路 采用vue3实现的课堂点名程序&#xff0c;模拟课堂座位布局&#xff0c;点击开始点名按钮后&#xff0c;一朵鲜花在座位间传递&#xff0c;直到点击结束点名按钮&#xff0c;鲜花停留的座位被点名。 课堂点名 座位组件 seat.vue <script setup>//组合式APIimpo…

Springboot 中如何使用Sentinel

在 Spring Boot 中使用 Sentinel 非常方便&#xff0c;Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件&#xff0c;可以快速将 Sentinel 集成到你的 Spring Boot 应用中&#xff0c;并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …

IoTDB 导入数据时提示内存不足如何处理

问题现象 IoTDB 导入数据时提示内存不足&#xff0c;该如何处理&#xff1f; 解决方案 数据导入脚本会在触发内存不足的时候主动进行重试。当遇到此问题时&#xff0c;用户不用做任何操作&#xff0c;脚本也可以正确进行处理。如果想从根源减少此类提示&#xff0c;可以按照下…

计算机视觉中图像的基础认知

一、图像/视频的基本属性 在计算机视觉中&#xff0c;图像和视频的本质是多维数值矩阵。图像或视频数据的一些基本属性。 宽度&#xff08;W&#xff09; 和 高度&#xff08;H&#xff09; 定义了图像的像素分辨率&#xff0c;单位通常是像素。例如&#xff0c;一张 1920x10…

【React】组件通信

组件通信 父传子 - props function Article(props) {return (<div><h2>{props.title}</h2><p>{props.content}</p><p>状态&#xff1a; {props.active ? 显示 : 隐藏}</p></div>) } // 设置默认值方式一 // 使用 defaultPr…

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中&#xff0c;可以通过Tomcat安装目录中“\bin\service.bat”来完成&#xff0c;如果目录中没有service.bat&#xff0c;则需要使用其它方法。 打到CMD命令行窗口&#xff0c;通过cd命令跳转到Tomcat安装目录的“\bin\”目录&#xff0c;然后执…

基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能

一、介绍 蘑菇识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;基于TensorFlow搭建卷积神经网络算法&#xff0c;并收集了9种常见的蘑菇种类数据集【“香菇&#xff08;Agaricus&#xff09;”, “毒鹅膏菌&#xff08;Amanita&#xff09;”, “牛肝菌&…

124 巨坑uni-app踩坑事件 uniCloud本地调试服务启动失败

1.事情是这样的 事情是这样的&#xff0c;我上午在运行项目的时候还是好好的&#xff0c;我什么都没干&#xff0c;没动代码&#xff0c;没更新&#xff0c;就啥也没干&#xff0c;代码我也还原成好好的之前的样子&#xff0c;就报这个错&#xff0c;但是我之前没用过这个服务呀…