CSharp(C#)语言_第六章(表达式和运算符)
表达式和运算符
- 6.1 表达式
- 6.2 字面量
- 6.2.1 整数字面量
- 6.2.2 实数字面量
- 6.2.3 字符字面量
- 6.2.4 字符串字面量
- 6.3 求值顺序
- 6.4 简单算术运算符
- 6.5 求余运算符
- 6.6 关系比较运算符和相等比较运算符
- 6.7 递增运算符和递减运算符
- 6.8 条件逻辑运算符
- 6.9 逻辑运算符
- 6.10 移位运算符
- 6.11 赋值运算符
- 6.12 条件运算符
- 6.14 用户定义类型转换
- 6.15 运算符重载
- 6.15.1 运算符重载的限制
- 6.16 typeof运算符
- 6.17 其他运算符
6.1 表达式
运算符是一个符号,它表示返回单个结果的操作。操作数(operand)是指作为运算符输入的数据元素。一个运算符会:
● 将操作数作为输入
● 执行某个操作
● 基于该操作返回一个值
表达式是运算符和操作数的字符串。可以作为操作数的结构有:
● 字面量
● 常量
● 变量
● 方法调用
● 元素访问器,如数组访问器和索引器
● 其他表达式
6.2 字面量
字面量(literal)是源代码中键入的数字或字符串,表示一个指定类型的明确的、固定的值
预定义类型有自己的字面量形式
◾ bool有两个字面量:true 和 false
◾ 对于引用类型变量,字面量 null 表示变量没有设置为内存中的数据
6.2.1 整数字面量
整数字面量是最常见的字面量(一般为十进制数字序列)
◾ 没有小数点
◾ 带有可选的后缀,指明整数的类型
整数类型字面量还可以写成十六进制(hex)形式,数字必须是十六进制数(从0到F),而且字符串必须以0x
或0X
开始(数字0,字母x)
6.2.2 实数字面量
实数字面量的组成如下:
◾ 十进制数字
◾ 一个可选的小数点
◾ 一个可选的指数部分
◾ 一个可选的后缀
格式:【十进制数字
.
十进制数字
指数(e±xx)
后缀
】
实数字面量的后缀:
后缀 | 实数类型 |
---|---|
无、D、d | double |
F、f | float |
M、m | decimal |
6.2.3 字符字面量
字符字面量有两个单引号内的字符组成,字符字面量可以是下面任意一种:单个字符、一个简单转义序列、一个十六进制转义序列或一个Unicode转义序列
◾ 字符字面量的类型是char
◾ 简单转义序列是一个反斜杠后面跟着单个字符
◾ 十六进制转义序列是一个反斜杠,后面跟着一个大写或小写的x,后面再跟着4个十六进制数字
◾ Unicode转义序列是一个反斜杠,后而跟着一个大写或小写的u,后面再跟着4个十六进制数字
重要的特殊字符
名称 | 转义序列 | 十六进制编码 |
---|---|---|
空字符 | \o | 0x0000 |
警告 | \a | 0x0007 |
退格符 | \b | 0x0008 |
水平制表符 | \t | 0x0009 |
换行符 | \n | 0x000A |
重直制表符 | \v | 0x000B |
换页符 | \f | 0x000C |
回车符 | \r | Ox000D |
双引号 | \" | 0x0022 |
单引号 | \’ | 0x0027 |
反斜杠 | |0x005C |
6.2.4 字符串字面量
字符串字面量使用双引号标记,不同于字符字面量使用单引号
有两种字符串字面量类型:
◾ 常规字符串字面量
◾ 逐字字符串字面量常规字符串申字面量由双引号内的字符序列组成。规则字符串字面量可以包含:
◾ 字符
◾ 简单转义序列
◾ 十六进制和Unicode转义序列
逐字字符串字面量的书写如同常规字符串字面量,但它以一个@字符为前缀。逐字字符串字面量有以下重要特征:
◾ 逐字字面量与常规字符串字面量区别在于转义字符串不会被求值。在双引号中间的所有内容,包括通常被认为是转义序列的内容,都被严格按字符串中列出的那样打印
◾ 逐字字面量的唯一例外是相邻的双引号组,它们被解释为单个双引号字符
6.3 求值顺序
表达式可以由许多嵌套的子表达式构成,子表达式的求值顺序可以使表达式的最终值发生差别
运算符优先级:从高到低
分类 | 运算符 |
---|---|
初级运算符 |
a.x 、f(x) 、a[x] 、x++ 、x-- 、new 、typeof 、checked 、unchecked
|
一级运算符 |
+ 、- 、! 、++x 、--x 、(T)x
|
乘法 |
* 、/ 、%
|
加法 |
+ 、-
|
移位 |
<< 、>>
|
关系和类型 |
< 、> 、<= 、>= 、is 、as
|
相等 |
== 、!=
|
位与 |
&
|
位异 |
^
|
位异或 | ` |
条件与 |
&&
|
条件或 | ` |
条件选择 |
?:
|
赋值运算符 |
= 、*= 、/= 、%= 、+= 、-= 、<<= 、>>= 、&= 、^= 、`
|
6.4 简单算术运算符
简单算术运算符执行基本的四则运算
运算符 | 名 称 | 描 述 |
---|---|---|
+ | 加 | 计算两个操作数的和 |
- | 减 | 从第一个操作数中减去第二个操作数 |
* | 乘 | 求两个操作数的乘积 |
/ | 除 | 用第二个操作数除第一个。整数除法,裁取整数部分到最近的整数 |
6.5 求余运算符
求余运算符(%)
用第二个操作数除第一个操作数,忽略掉商,并返回余数
运算符 | 名 称 | 描 述 |
---|---|---|
% | 求余 | 用第二个操作数除第一个操作数并返回余数 |
6.6 关系比较运算符和相等比较运算符
关系比较运算符和相等比较运算符是二元运算符,比较它们的操作数并返回bool
型值
运算符 | 名 称 | 描 述 |
---|---|---|
< | 小于 | 如果第一个操作数小于第二个操作数,返回true,否则返回false |
|大于| 如果第一个操作数大于第二个操作数,返回true,否则返回false
<=|小于等于 |如果第一个操作数小于等于第二个操作数,返回true,否则返回false
=|大于等于 |如果第一个操作数大于等于第二个操作数,返回true,否则返回false
==|等于| 如果第一个操作数等于第二个操作数,返回true,否则返回false
!=|不等于| 如果第一个操作数不等于第二个操作数,返回true,否则返回false
C#中数字不具有bool
意义
比较操作和相等性操作
对于大多数引用类型来说,比较它们的相等性时,将只比较它们的引用
◾ 如果引用相等,也就是说,如果它们指向内存中相同对象,那么相等性比较为true,否则为false,即使内存中两个分离的对象在所有其他方面都完全相等
◾ 这称为浅比较
string类型对象也是引用类型,但它的比较方式不同。比较字符串的相等性时,将比较它们的长度和内容(区分大小写)
◾ 如果两个字符串有相同的长度和内容(区分大小写),那么相等性比较返回true,即使它们占用不同的内存区域
◾ 这称为深比较(deep comparison)
6.7 递增运算符和递减运算符
运算符 | 名 称 | 描 述 |
---|---|---|
++
|
前置递增++ var
|
变量的值加1并保存 返回变量的新值 |
++
|
后置递增var++
|
变量的值加1并保存 返回变量递增之前的旧值 |
--
|
前置递减-- var
|
变量的值减1并保存 返回变量的新值 |
--
|
后置逆减var--
|
变量的值减1并保存 返回变量递减之前的旧值 |
◾ 无论运算符使用前置形式还是后置形式,在语句执行之后,最终存放在操作数的变量中的值是相同的 | ||
◾ 唯一不同的是运算符返回给表达式的值 |
6.8 条件逻辑运算符
逻辑运算符用于比较或否定它们的操作数的逻辑值,并返回结果逻辑值
逻辑与(AND)和逻辑或(OR)运算符是二元左结合运算符。逻辑非(NOT)是一元运算符
运算符 | 名 称 | 描 述 |
---|---|---|
&&
|
与 | 如果两个操作数都是true,结果为true;否则为false |
` | ` | |
!
|
非 | 如果操作数是false,结果为true;否则为false |
6.9 逻辑运算符
按位逻辑运算符常用于设置位组(bit pattem)的方法参数
这些运算符,除按位非运算符以外,都是二元左结合运算符,按位非是一元运算符
运算符 | 名 称 | 描 述 |
---|---|---|
&
|
位与 | 产生两个操作数的按位与。仅当两个操作位都为1时结果位才是1 |
` | ` | 位或 |
^
|
位异或 | 产生两个操作数的按位异或。仅当一个而不是两个操作数为1时结果位为1 |
~
|
位非 | 操作数的每个位都取反。该操作得到操作数的二进制反码(数字的反码是其二进制形式按位取反的结果。也就是说,每个0都变成1,每个1都变成0) |
二元按位运算符比较它的两个操作数中每个位置的相应位,并依据逻辑操作设置返回值中的位
6.10 移位运算符
按位移位运算符向左或向右把位组移动指定数量个位置,空出的位用0或1填充
移位运算符是二元左结合运算符
运算符 | 名 称 | 描 述 |
---|---|---|
<<
|
左移 | 将位组向左移动给定数日个位置。位从左边移出井丢失。右边打开的位位置用0填充 |
>>
|
右移 | 将位组向右移动给定数目个位置。位从右边移出并丢失 |
6.11 赋值运算符
赋值运算符对运算符右边的表达式求值,并用该值设置运算符左边的变量表达式的值
赋值运算符是二元右结合运算符
运算符 | 描 述 |
---|---|
=
|
简单赋值,计算右边表达式的值,并把返回值赋给左边的变量或表达式 |
*=
|
复合赋值,var*=expr 等价于 var = var*(expr)
|
/=
|
复合赋值,var/=expr 等价于 var = var/(expr)
|
%=
|
复合赋值,var%=expr 等价于 var = var%(expr)
|
+=
|
复合赋值,var+=expr 等价于 var = var+(expr)
|
-=
|
复合赋值,var-=expr 等价于 var = var-(expr)
|
<<=
|
复合赋值,var<<=expr 等价于 var = var<<(expr)
|
>>=
|
复合赋值,var>>=expr 等价于 var = var>>(expr)
|
&=
|
复合赋值,var&=expr 等价于 var = var&(expr)
|
^4=
|
复合赋值,var^=expr 等价于 var = var^(expr)
|
` | =` |
6.12 条件运算符
条件运算符是一种强大且简洁的方法,基于条件的结果,返回两个值之一
条件运算符是三元运算符
运算符 | 名 称 | 描述 |
---|---|---|
?: | 条件运算符 |
对一个表达式求值,并依据表达式是否返回true 或false ,返回两个值之一
|
6.14 用户定义类型转换
可以为自己的类和结构定义隐式转换和显式转换。这允许把用户定义类型的对象转换成某个其他类型,反之亦然
C#提供隐式转换和显式转换
■ 对于隐式转换,当决定在特定上下文中使用特定类型时,如有必要,编译器会自动执行转换
■ 对于显式转换,编译器只在使用显式转换运算符时才执行转换
6.15 运算符重载
C#运算符被定义为使用预定义类型作为操作数来工作。如果面对一个用户定义类型,运算符完全不知道如何处理它。运算符重载允许你定义C#运算符应该如何操作自定义类型的操作数
● 运算符重载只能用于类和结构
● 为类或结构重载一个运算符x,可以声明一个名称为operator x
的方法并实现它的行为(例如:operator +
和operator -
等)
■ 一元运算符的重载方法带一个单独的class或struct类型的参数
■ 二元运算符的重载方法带两个参数,其中至少有一个必须是class或struct类型
public static LimitedInt operator-(LimitedInt x) // Unary
public static LimitedInt operator +(LimitedInt x,double y) // Binary
运算符重载的方法声明:
■ 声明必须同时使用static和public的修饰符
■ 运算符必须是要操作的类或结构的成员
6.15.1 运算符重载的限制
不是所有运算符都能被重载,可以重载的类型也有限制
可重载的一元运算符:
+
、-
、!
、~
、++
、--
、true
、false
可重载的二元运算符:+
、-
、*
、/
、%
、&
、|
、^
、<<
、>>
、==
、!=
、>
、<
、<=
、>=
运算符重载不能做下面的事情:
■ 创建新运算符
■ 改变运算符的语法
■ 重新定义运算符如何处理预定义类型
■ 改变运算符的优先级或结合性
6.16 typeof运算符
typeof运算符返回作为其参数的任何类型的System.Type对象。通过这个对象,可以了解类型的特征。(对任何已知类型,只有一个System.Type对象。)你不能重载typeof运算符
typeof运算符是一元运算符
运算符 | 描述 |
---|---|
typeof | 返回已知类型的System.Type对象 |
6.17 其他运算符
这里不介绍
CSharp(C#)语言_第六章(表达式和运算符)相关推荐
- CSharp(C#)语言_第五章(类和继承)
类和继承 5.1 类继承 5.2 访问继承的成员 5.3 所有类都派生自object类 5.4 隐藏基类成员 5.5 基类访问 5.6 使用基类的引用 5.6.1 虚方法和覆写方法 5.6.2 覆写标 ...
- CSharp(C#)语言_第四章(类的深入理解)
类的深入理解 4.1 类成员 4.2 成员修饰符的顺序 4.3 实例类成员 4.4 静态字段 4.5 从类的外部访问静态成员 4.5.1 静态成员的生存周期 4.6 静态函数成员 4.7 其他静态类成 ...
- CSharp(C#)语言_委托和事件区别详解
委托和事件区别详解 委托和事件的概念 委托 事件 委托和事件的作用 委托 事件 委托和事件的区别 委托和事件的详细解答请看C#系列文章 委托和事件代码实践 委托 事件 总结 委托和事件的概念 委托 ...
- c语言第六章条件型循环结构,C语言课件(第六章 循环结构)
C语言课件 第六章 循环结构 在许多复杂的问题中,常常需要做大量的类似的计算处理,这些类似的相同的处理过程存在重复性过程,即在某种条件成立的情况下需要处理相同的操作时,就要使用循环结构来完成. 类似于 ...
- c语言编程作业最大整数问题,C语言编程第六章作业答案.doc
C语言编程第六章作业答案 1. 输入两个正整数m和n,求其最大公约数和最小公倍数. 辗除法--辗转相除法, 又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法. ...
- c语言利用循环结构解决密码转换,C语言课件第六章循环结构.ppt
C语言课件第六章循环结构 第6章 循环结构程序设计 6.1循环结构的组成 循环结构:描述有规律的重复操作问题. 组成:要重复执行的操作,重复执行所需的条件. 例6.1:求10! . 分析:计算1*2* ...
- 系统架构师学习笔记_第六章(下)_连载
系统架构师学习笔记_第六章(下)_连载 6.3 基于 UML 的软件开发过程 6.3.1 开发过程概述 UML 是独立于软件开发过程的,能够在几乎任何一种软件开发过程中使用.迭代的渐进式软件开发过程 ...
- 不足100克按100克C语言,C语言_第3章.ppt
C语言_第3章 C语言的语句可分为以下四类: 简单语句 空语句 复合语句 流程控制语句 三.复合语句用一对花括号,把若干条语句括起来,就形成了一条复合语句.形式如下: {[内部数据描述语句] 语句1: ...
- 谭浩强c语言第7章14题,谭浩强C语言_第7章_函数2.ppt
谭浩强C语言_第7章_函数2 第八章 函数 函数概述 #include void main() { float average(float array[10]); /* 函数声明 */ float s ...
最新文章
- 360浏览器使用评价
- 半阈值化的应用说明及利用函数threshold实现半阈值化的方法
- ITK:预定义操作以对应两个图像中的像素
- XCTF-高手进阶区:ics-04
- iview的走马灯嵌套在模态框中,宽度为0的解决方案
- windows上安装mysql5.7.24
- 数据结构与算法——冒泡排序(改进后)
- python缩进注意事项_python注意事项
- 2016年世界编程大赛_2016年热门编程趋势
- Android ListView选中项居中放大(使用上下键控制,非触屏)
- Chrome三天内的第二枚0Day
- 【汇编优化】之linux下如何利用gdb调试汇编代码
- ubuntu 安装sql_在Ubuntu上进行SQL Server安装和故障排除
- Collections.sort new Compartor 用法
- 实验设计的道德伦理考量
- @property的用法
- 32位系统支持多大内存 Windows32位/64位系统最大支持内存详解
- 学校食堂工作流程图流程图模板分享
- 机器学习作业-FOGS: 基于学习图的一阶梯度监督交通流预测
- 【mysql的设计与优化专题(5)】慢查询详解
热门文章
- Redis源码阅读,从入门到放弃
- Error Code: 1318. Incorrect number of arguments for PROCEDURE student.new_procedure; expected 0, got
- 陀螺仪程序---可直接用
- 《Pro SQL Server Internals, 2nd edition》 作者:Dmitri KorotkevitchP55-58 P62-65 P68-69
- 梁宇轩 mysql 语句学习一 对表的操作
- 深入浅出C++ ——初识C++
- 诚之和:3个月亏17亿,贝壳释放了什么信号?
- 133、初沸点的概念
- 【架构师实践课】微服务如何拆分?大型微服务项目从何下手?
- 【渝粤题库】陕西师范大学292011 初级微观经济学 作业(高起专)