字面量
整数字面量
- 十六进制(hex),数字范围(0-F),必须以
0x或0X开始。
- 二进制,数字范围(0或者1),必须以
0b或0B开始。
| 后缀 |
整数类型 |
备注 |
| 无 |
int、uint、long、ulong |
— |
| U、u |
uint、ulong |
— |
| L、l |
long、ulong |
不推荐使用小写字母l,因为它很容易和数字1弄混 |
| ul、uL、Ul、UL、lu、Lu、lU、LU |
ulong |
不推荐使用小写字母l,因为它很容易和数字1弄混 |
实数字面量
| 后缀 |
实数类型 |
| 无 |
double |
| F、f |
float |
| D、d |
double |
| M、m |
decimal |
无后缀的实数字面量是double类型,不是float类型。
字符字面量
| 名称 |
转义序列 |
十六进制编码 |
| 空字符 |
\0 |
0x0000 |
| 警告 |
\a |
0x0007 |
| 退格符 |
\b |
0x0008 |
| 水平制表符 |
\t |
0x0009 |
| 换行符 |
\n |
0x000A |
| 垂直制表符 |
\v |
0x000B |
| 换页符 |
\f |
0x000C |
| 回车符 |
\r |
0x000D |
| 双引号 |
“ |
0x0022 |
| 单引号 |
‘ |
0x0027 |
| 反斜杠 |
|0x005C |
|
字符串字面量
两种字符串字面量类型:
- 常规字符串字面量;
- 逐字字符串字面量;
- 逐字字符串字面量以一个@字符为前缀。
- 字符串中的转义序列不会被求值。
- 逐字字符串字面量的唯一例外是相邻的双引号组,它们被解释为单个双引号字符。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| string rst1 = "Hi there!"; string vst1 = @"Hi there!";
string rst2 = "It started, \"Four score and seven...\""; string vst2 = @"It started, ""Four score and seven...""";
string rst3 = "Value 1 \t 5, Val2 \t 10"; string vst3 = @"Value 1 \t 5, Val2 \t 10";
string rst4 = "C:\\Program Files\\Microsoft\\"; string vst4 = @"C:\Program Files\Microsoft\";
string rst5 = " Print \x000A Multiple \u000A Lines"; string vst5 = @" Print Multiple Lines";
|
输出结果为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| Hi there! Hi there!
It started, "Four score and seven..." It started, "Four score and seven..."
Value 1 5, Val2 10 Value 1 \t 5, Val2 \t 10
C:\Program Files\Microsoft\ C:\Program Files\Microsoft\
Print Multiple Lines
Print Multiple Lines
|
求值顺序
运算符优先级:从高到低
| 分类 |
运算符 |
| 初级运算符 |
a.x、f(x)、a[x]、x++、x–、new、typeof、checked、unchecked |
| 一元运算符 |
+、-、!、~、++x、–x、(T)x |
| 乘法 |
*、/、% |
| 加法 |
+、- |
| 移位 |
<<、>> |
| 关系和类型 |
<、>、<=、>=、is、as |
| 相等 |
==、!= |
| 位与 |
& |
| 位异或 |
^ |
| 位或 |
| |
| 条件与 |
&& |
| 条件或 |
| |
| 条件选择 |
?: |
| 赋值运算符 |
=、*=、/=、%=、+=、-=、<<=、>>=、&=、^=、|= |
简单算术运算符
| 运算符 |
名称 |
描述 |
| + |
加 |
计算两个操作数的和 |
| - |
减 |
从第一个操作数中减去第二个操作数 |
| * |
乘 |
求两个操作数的乘积 |
| / |
除 |
用第二个操作数除第一个。整数除法,截取整数部分到最近的整数 |
求余运算符
| 运算符 |
名称 |
描述 |
| % |
求余 |
用第二个操作数除第一个操作数并返回余数 |
关系比较运算符和相等比较运算符
| 运算符 |
名称 |
描述 |
< |
小于 |
如果第一个操作数小于第二个操作数,返回 true,否则返回 false |
> |
大于 |
如果第一个操作数大于第二个操作数,返回 true,否则返回 false |
<= |
小于等于 |
如果第一个操作数小于等于第二个操作数,返回 true,否则返回 false |
>= |
大于等于 |
如果第一个操作数大于等于第二个操作数,返回 true,否则返回 false |
== |
等于 |
如果第一个操作数等于第二个操作数,返回 true,否则返回 false |
!= |
不等于 |
如果第一个操作数不等于第二个操作数,返回 true,否则返回 false |
引用类型比较相等性时,比较的是它们的引用。
递增运算符和递减运算符
| 运算符 |
名称 |
描述 |
++ |
前置递增 ++var |
变量的值加 1 并保存,返回变量的新值 |
++ |
后置递增 var++ |
变量的值加 1 并保存,返回变量递增之前的旧值 |
-- |
前置递减 --var |
变量的值减 1 并保存,返回变量的新值 |
-- |
后置递减 var-- |
变量的值减 1 并保存,返回变量递减之前的旧值 |
条件逻辑运算符

![[csharp-5-expression-operator.png]]
逻辑运算符(位运算)
| 运算符 |
名称 |
描述 |
& |
位与 |
产生两个操作数的按位与。仅当两个操作位都为 1 时结果位才是 1 |
| |
位或 |
产生两个操作数的按位或。只要任意一个操作位为 1 结果位就是 1 |
^ |
位异或 |
产生两个操作数的按位异或。仅当一个而不是两个操作数为 1 时结果位为 1 |
~ |
位非 |
操作数的每个位都取反。该操作得到操作数的二进制反码(数字的反码是其二进制形式按位取反的结果。也就是说,每个 0 都变成 1,每个 1 都变成 0) |
1 2 3 4 5 6 7
| const byte x = 12, y = 10; sbyte a;
a = x & y; a = x | y; a = x ^ y; a = ~x;
|

![[csharp-5-expression-operator1.png]]
移位运算符
| 运算符 |
名称 |
描述 |
<< |
左移 |
将位组向左移动给定数目个位置。位从左边移出并丢失。右边打开的位位置用 0 填充 |
>> |
右移 |
将位组向右移动给定数目个位置。位从右边移出并丢失 |
1 2 3 4 5 6 7
| int a, b, x = 14;
a = x << 3; b = x >> 3;
Console.WriteLine($"{ x } << 3 = { a }"); Console.WriteLine($"{ x } >> 3 = { b }");
|

![[csharp-5-expression-operator2.png]]
赋值运算符
| 运算符 |
描述 |
= |
简单赋值,计算右边表达式的值,并把返回值赋给左边的变量或表达式 |
*= |
复合赋值,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) |
^= |
复合赋值,var ^= expr 等价于 var = var ^ (expr) |
|= |
复合赋值,var |= expr 等价于 var = var | (expr) |
条件运算符
唯一的三元运算符
| 运算符 |
名称 |
描述 |
?: |
条件运算符 |
对一个表达式求值,并依据表达式是否返回 true 或 false,返回两个值之一 |
1 2 3 4 5 6
| if(x < y) intVar = 5; else intVar = 10; intVar = x < y ? 5 : 10;
|
一元运算符
| 运算符 |
名称 |
描述 |
+ |
正号 |
返回操作数的数值 |
- |
负号 |
返回 0 减操作数得到的值 |
1 2 3
| int a = 5; int b = +a; int c = -a;
|
类型转换(也是一种运算符)
后续展开写
运算符重载
- 运算符重载只能用于类和结构。
- 声明必须同时使用static和public的修饰符。
- 运算符必须是要操作的类或结构的成员。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| class LimitedInt { const int MaxValue = 100; const int MinValue = 0; public static LimitedInt operator -(LimitedInt x) { LimitedInt li = new LimitedInt(); li.TheValue = 0; return li; } public static LimitedInt operator -(LimitedInt x, LimitedInt y) { LimitedInt li = new LimitedInt(); li.TheValue = x.TheValue - y.TheValue; return li; } public static LimitedInt operator +(LimitedInt x, double y) { LimitedInt li = new LimitedInt(); li.TheValue = x.TheValue + (int)y; return li; } private int _theValue = 0; public int TheValue { get { return _theValue; } set { if (value < MinValue) _theValue = 0; else _theValue = value > MaxValue ? MaxValue : value; } } }
class Program { static void Main() { LimitedInt li1 = new LimitedInt(); LimitedInt li2 = new LimitedInt(); LimitedInt li3 = new LimitedInt(); li1.TheValue = 10; li2.TheValue = 26; Console.WriteLine($" li1: { li1.TheValue }, li2: { li2.TheValue }"); li3 = -li1; Console.WriteLine($"-{ li1.TheValue } = { li3.TheValue }"); li3 = li2 - li1; Console.WriteLine($" { li2.TheValue } - { li1.TheValue } = { li3.TheValue }"); li3 = li1 - li2; Console.WriteLine($" { li1.TheValue } - { li2.TheValue } = { li3.TheValue }"); } }
|
运算符重载的限制
可重载的一元运算符:+ - ! ~ ++ -- true false
可重载的二元运算符:+ - * / % & | ^ << >> == != > < >= <=
typeof运算符
| 运算符 |
描述 |
typeof |
返回已知类型的 System.Type 对象 |
typeof(T):编译时获取类型,作用于类型本身;
obj.GetType():运行时获取对象实际类型,作用于实例;
nameof运算符
| 运算符 |
描述 |
nameof |
返回用来表示变量、类型或者成员的字符串 |
其他运算符
可空类型