C#教程(5)———— 算术运算符

2023-11-16

前言

在前面的几篇文章中,我们主要介绍了C#的几种数据类型,那么仅仅有了数据对于我们来说还是不够的,否则计算机就不叫计算机了,改叫记录器了,所以,我们还要对这些数据进行各种各样的计算,而计算自然离不开各种不同的运算符了,所以在这篇文章中,我们主要来介绍最基础的算术运算符以及赋值运算符。

1 算术运算符

在具体解释各类运算符之前,我们需要先搞明白什么叫运算符,从定义来说:运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。 说的简单一点,就像我们学数学时写的算式一样,我们需要用各种符号来表示加减乘除等运算,那么这里的加号(+)减号(-)等符号就是所谓的运算符了,只是数学中我们写在纸上的算式是给人看的,但在编程中,我们写的运算符是在告诉电脑应该做什么操作而已。

在C#中,算术运算符一共有7个,分别为:

运算符 名称 描述
+ 加法运算符 将两数相加获得相加的和
- 减法运算符 将两数相减获得差值
* 乘法运算符 将两数相乘获得积
/ 除法运算符 将两数相除获得商
% 取余运算符 将两数相除后取得余数
++ 自增运算符 数值加1
自减运算符 数值减1

1.1 基本运算符

在这7个运算符中,我们先来讨论前五个运算符,加减乘除和取余,这五个运算符应该看起来非常眼熟,就如同我们数学中学的一样,这五个运算符都是在对运算符左右两边的数值进行运算,但在程序中,由于我们将数据分为了许多不同的数据类型,所以还是有一些要注意的地方的,其中最主要的一点就是:

  • 运算符左右的操作数必须是数值或能够转换为数值

这一个要求在C#中尤为重要,因为C#有着大量各式各样的数据类型,所以在做运算时,哪些数据类型能够进行运算,哪些不行是需要格外注意的问题。

(1)数值类型和数值类型

数值类型之间的运算是最基本的,无论是整数和整数之间运算还是浮点数之间的运算,又或者整数和浮点数之间运算,都是可以的,运算符两侧的操作数也既可以是对应类型的变量,也可以是具体的数值,如:

int intValue = 5;
float floatValue = 1.2f;
Console.WriteLine(1 + 2);//结果为:3
Console.WriteLine(intValue - 2);//结果为:3
Console.WriteLine(floatValue * 2);//结果为:2.4
Console.WriteLine(intValue - floatValue);//结果为:3.8
Console.WriteLine(5 % 2);//结果为:1

以上代码片段中的五个运算都是正确的,可以正常的输出计算结果。

另外,在C#中,算术运算符的运算优先级和数学中的运算优先级一致,在一个较长的表达式中,会优先计算乘、除、取余三类运算,再算加减运算,当然和数学中一致,有括号也是先算括号内。

Console.WriteLine(5 + 2 * 6 + 5 % 2 );//结果为:18
Console.WriteLine(5 + 2 * ( 6 + 5 ) % 2 );//结果为:5

(2)字符类型运算

在之前文章中我们介绍过,计算机存储字符类型是使用的编码表,将字符根据编码表转变为一个数值进行存储,所以说字符类型是可以转换为数值类型的,那么字符类型可以参与算术运算么?如在ASCII码表中,字符‘a’对应的编码值为97.

Console.WriteLine(5 + 'a');//结果为:102
Console.WriteLine(5 - 'a');//结果为:-92
Console.WriteLine(2 * 'a');//结果为:194
Console.WriteLine(97 / 'a');//结果为:1
Console.WriteLine(98 % 'a');//结果为:1
Console.WriteLine('a' + 'a');//结果为:194

通过以上代码及运算结果,我们可以发现,字符类型也可以作为算术运算符的操作数参与算术运算,但运算中并非以字符本身,而是根据编码表转换为了数值类型参与了具体的运算,所以并没有违反我们在之前给出的要求。

(3)字符串运算

与字符类型不同,在之前文章中我们说过字符串可以看做是一堆字符类型的集合,所以在运算时无法轻易地转换为数值类型进行运算,但并非所有的运算符都对字符串无效,在之前我们也提到过一个特殊的运算符,那就是“+”,这个运算符可以应用于字符串,但应用于字符串时,它就不再叫做“加法运算符”了,而是变成了“字符串拼接符”,他的作用是将左右两边都转换为字符串,并将两个字符串进行拼接,如:

Console.WriteLine("hello" + " world");//输出结果为:hello world
Console.WriteLine("衬衫的价格是" + 9 + "磅" + 15 + "便士");//输出结果为:衬衫的价格是9磅15便士

在上面的两行代码中,我们可以看到,当“+”运算符应用于字符串或字符串和其它类型之间时,将不再作为加法,而是拼接,即使一边为字符串,另一边为数值,也是将数值变成字符串进行拼接。

(4)布尔类型运算

较为特殊的是,之前讲解数据类型时我们有提到,布尔类型在C#中无法转变为其它的任何类型,也无法用1代表true,0代表false,因此,布尔类型无法转变为数值类型,也就无法被应用于任何算术运算。

特别注意点:
1、除法运算符右侧,也就是除数不能为0;
2、两个整数相除得到的结果也会是一个整数,小数部分会被忽略,如不想小数被忽略,需要把除号两端的操作数强转为浮点数类型;
3、取余操作符右侧操作数不能为0;
4、取余操作的结果如果不是零的话,则结果的正负号和左侧操作数正负号一致,与右侧操作数正负号无关。

1.2 自增自减运算符

自增自减运算符只需要一个操作数,他的作用是将操作数转变为数值后,在数值上直接加上或减去1,如:

int intValue = 1;
intValue++;//等价于intValue = intValue + 1
Console.WriteLine(intValue);//输出结果为:2
intValue--;//等价于intValue = intValue - 1
Console.WriteLine(intValue);//输出结果为:1

如以上代码显示,一定要注意的是,自增自减运算符在运算完后会修改变量本身的值,并非是一次性的,所以在使用时一定要注意,这个值是否需要修改或修改后是否会存在问题。

自增和自减运算符放在操作数前和放在操作数后都可以,但放在之前会先进行自增或自减操作,再返回变量值,放在之后会先返回操作数,再进行自增或自减操作。

int num = 1;
int num1 = num++;
Console.WriteLine(num1);//输出的结果为:1
Console.WriteLine(num);//输出的结果为:2

int num2 = 1;
int num3 = ++num2;
Console.WriteLine(num3);//输出的结果为:2
Console.WriteLine(num2);//输出的结果为:2

如上文所说,自增和自减运算符无论放在操作数前还是后都是可以运算的,且都是在变量本身的基础上加上1或减去1,唯独运算顺序不同。

如代码中的上半段,使用了num++,将运算符放在了操作数后,因此在一开始会先将num本身的数值,也就是1通过等号赋值给num1变量,再进行自增,因此输出结果中,num1 = 1,而num = 2.

下半段中则使用了++num,将运算符放在了前面,所以在返回num数值之前,先进行了num2的自增操作,此时的num2数值已经等于2了,再通过等号赋值给前面的num3变量,所以这里的num2和num3都等于2。

需要注意,自增自减运算符只能应用于变量,不能应用于常量,也就是说定义一个变量进行自增是正确的,但如果直接写“2++”这样的代码,将会直接报错

3 赋值运算符

赋值运算符顾名思义,是用来给变量赋值的,而最常见的赋值运算符就是“=”。

int num = 1;//定义一个叫做num的变量,并赋值为1

int num1 = num;//定义一个叫做num1的变量,并将num的值赋值给这个变量

赋值运算符还可以与其他运算符结合使用,如:

int num1 = 1;
int num2 = 2;
//等同于num2 = num2 + num1
num2 += num1;
//等同于num2 = num2 - num1
num2 -= num1;
//等同于num2 = num2 * num1
num2 *= num1;
//等同于num2 = num2 / num1
num2 /= num1;
//等同于num2 = num2 % num1
num2 %= num1;

除了像上面一样应用于两个变量外,也可以应用于一个变量一个常数的情况。

int num = 1;
//等同于num = num + 2
num += 2;

这样的复合运算符,相当于先进行了运算,再将运算的结果返回给了自己,也就是说这种运算符的使用也会修改变量本身的值,因此使用时也需要注意变量值的改变。

总结

以上就是今天要介绍的内容,在这篇文章中,主要介绍了常见的几种算术运算符以及赋值运算符的使用方法及特点,其中自增自减以及赋值运算符和算术运算符的复合使用都会修改变量本身值,在使用时需要多加理解和练习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#教程(5)———— 算术运算符 的相关文章

  • 是否有与 posix_memalign 对应的 C++ 版本?

    当我打电话时posix memalign http man7 org linux man pages man3 posix memalign 3 html为类型的对象分配对齐的内存Foo在我的 C 代码中 我需要做一个reinterpret
  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • GetType() 在 Type 实例上返回什么?

    我在一些调试过程中遇到了这段代码 private bool HasBaseType Type type out Type baseType Type originalType type GetType baseType GetBaseTyp
  • C++ 是否可以在 MacOS 上与 OpenMP 和 boost 兼容?

    我现在已经尝试了很多事情并得出了一些结论 也许 我监督了一些事情 但似乎我无法完成我想要的事情 问题是 是否有可能使用 OpenMP 和 boost 在 MacOS High Sierra 上编译 C 一些发现 如果我错了请纠正我 Open
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 如何减少具有多个单元的 PdfPTable 的内存消耗

    我正在使用 ITextSharp 创建一个 PDF 它由单个 PdfTable 组成 不幸的是 对于特定的数据集 由于创建了大量 PdfPCell 我遇到了内存不足异常 我已经分析了内存使用情况 我有近百万个单元格的 1 2 在这种情况下有
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • 函数局部有界性定理_高等数学入门——函数极限的基本性质

    系列简介 这个系列文章讲解高等数学的基础内容 注重学习方法的培养 对初学者不易理解的问题往往会不惜笔墨加以解释 在内容上 以国内的经典教材 同济版高等数学 为蓝本 并对具体内容作了适当取舍与拓展 例如用 语言证明函数极限这类高等数学课程不要
  • API学习笔记:2.3-2.4 API核心DLL与Unicode和多字节

    API核心DLL与Unicode和多字节 2 3 Windows核心DLL 2 3 1 核心DLL简介 2 4 Unicode和多字节 2 4 1 W版本和A版本的API 2 4 2 Unicode与ASCII的转换 前面几章基本都是总体的
  • ls: 显示目下的内容及相关属性信息

    ls 显示目下的内容及相关属性信息 功能说明 ls 命令可以理解为英文单词 list 的缩写 其功能是列出目录的内容及其内容属性信息 list directory contents 该命令有点类似于DOS系统下的dir命令 有趣的是 Lin
  • Linux内核分析:输入输出,字符与块设备 31-35

    CPU 并不直接和设备打交道 它们中间有一个叫作设备控制器 Device Control Unit 的组件 例如硬盘有磁盘控制器 USB 有 USB 控制器 显示器有视频控制器等 这些控制器就像代理商一样 它们知道如何应对硬盘 鼠标 键盘
  • 左孩子右兄弟 蓝桥杯1451 python

    题目描述 对于一棵多叉树 我们可以通过 左孩子右兄弟 表示法 将其转化成一棵二叉树 如果我们认为每个结点的子结点是无序的 那么得到的二叉树可能不唯一 换句话说 每个结点可以选任意子结点作为左孩子 并按任意顺序连接右兄弟 给定一棵包含 N 个
  • 利用cl_demo_output=>display( )实现日志的功能

    有一些客户需要对一些批处理程序进行消息日志提醒 需要用到弹窗ALV cl demo output gt display 是实现该功能最简单的方式 只需要定义一个内表就行了 如图所以 客户运行了一个库存导入的程序 将BAPI抛出的结果利用弹窗
  • debian 11搭建nis服务器

    NIS的由来与功能 NIS Network InformationService网络信息服务 用于对网络中的多台Linux系统的帐号和密码的集中管理和维护 也就是说可以用同一个帐号登录域中的Linux系统 不需要所登录的系统中存在该帐号 所
  • QT入门笔记(一)QT信号和槽

    QT入门笔记 Qt事件 Qt 事件指的是应用程序和用户之间的交互过程 例如用户按下某个按钮 点击某个输入框等等 实际上除了用户会与应用程序进行交互外 操作系统也会与应用程序进行交互 例如当某个定时任务触发时 操作系统会关闭应用程序 这也是一
  • Linux C基础——” Makefile “ 文件管理大师你拜访过嘛?

    文章目录 Make简介 Makefile基本结构 1 make是如何工作的 2 makefile文件中的依赖关系理解 3 Makefile书写规则 4 Makefile 基础的使用 3 makefile文件中的依赖关系理解 4 创建和使用变
  • 个人博客 blog

    介绍 blog是基于springboot搭建的个人博客 响应式 项目地址 https github com chy1984 blog 前端技术 html css js jq bootstrap 后台技术 springboot thymele
  • 公司章程变更需要经过哪些程序

    公司章程变更需要经过以下程序 1 提议修改公司章程 一般由董事会提出修改建议 董事会是公司经营的决策机构 对公司经营情况以及章程的执行和变化情况较为了解 能够对公司章程的修改提出具有积极意义的建议 2 将修改公司章程的提议通知股东 公司章程
  • 搜索引擎solr系列--3字节的UTF-8序列的字节3无效

    搜索引擎solr系列 3 字节的 UTF 8 序列的字节 3 无效问题 有一次在数据导入的时候 报出了这个错误 大概如下 Data config 3 字节的 UTF 8 序列的字节 3 无效 很明显编码问题 不管你是报了1字节 2字节 之类
  • Idea上运行eclipse项目及打包

    概述 最近有时间 想把原来eclipse的项目迁移到IntelliJ IDEA 中 迁移过程中遇到很多问题 再次记录一下 方便其他 童鞋 快速爬坑 迁移前准备 jdk安装及配置 不会的同学自行度娘 tomcat安装及配置 不会的同学自行度娘
  • System.arraycopy()详解

    java lang System arraycopy 方法复制指定的源数组的数组 在被copy的数组指定的位置开始 到目标数组的指定位置 具体方法如下 public static void arraycopy Object src int
  • IAR8.10.3编译ZStack-CC2530-2.3.0-1.4.0产生的警告解决方法

    http blog chinaunix net uid 24343357 id 3605556 html 分类 嵌入式 1 Warning w2 Symbol PBANK is redefined in command line 2 War
  • [org/springframework/boot/autoconfigure/web/ServerPropertiesAutoConfiguration.class] cannot be opene

    使用feign报错 org springframework beans factory BeanDefinitionStoreException Failed to process import candidates for configu
  • 华为机试真题 C++ 实现【最小调整顺序次数】【100%通过率】【2022.11 Q4 新题】

    题目 给定一个队列 但是这个队列比较特殊 可以从头部添加数据 也可以从尾部添加数据 但是只能从头部删除数据 输入一个数字n 会依次添加数字1 n 也就是添加n次 但是在添加数据的过程中 也会删除数据 要求删除必须按照1 n按照顺序进行删除
  • [docker入门教程系列] 使用dockerfile创建cuda:11.0-cudnn8-devel-ubuntu18.04镜像

    在dockerfile中这样写 FROM nvidia cuda 11 0 cudnn8 devel ubuntu18 04 RUN mv etc apt sources list etc apt sources list bak RUN
  • MyBatis看这一篇就够了(自动映射、手动映射[一对多、多对一]、延迟加载、动态SQL、缓存、逆向工程、分页)

    目录 一 MyBatis简介 1 1 MyBatis历史 1 2 什么是MyBatis MyBatis有啥特点 1 3 什么是ORM 1 4 MyBatis下载 1 5 和其它持久层技术对比 二 搭建MyBatis 2 0 开发环境 2 1
  • C#教程(5)———— 算术运算符

    C 教程 5 算术运算符 前言 1 算术运算符 1 1 基本运算符 1 2 自增自减运算符 3 赋值运算符 总结 前言 在前面的几篇文章中 我们主要介绍了C 的几种数据类型 那么仅仅有了数据对于我们来说还是不够的 否则计算机就不叫计算机了