字面量

整数字面量

  • 十六进制(hex),数字范围(0-F),必须以0x0X开始。
  • 二进制,数字范围(0或者1),必须以0b0B开始。
后缀 整数类型 备注
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 = 8
a = x | y; // a = 14
a = x ^ y; // a = 6
a = ~x; // a = -13


![[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; // b = 5
int c = -a; // c = -5

类型转换(也是一种运算符)

后续展开写

运算符重载

  • 运算符重载只能用于类和结构。
  • 声明必须同时使用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)
{
//在这个奇怪的类中,取一个值的负数等于0
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 }");
}
}

/*
* 输出结果:
* li1: 10, li2: 26
* -10 = 0
* 26 - 10 = 16
* 10 - 26 = 0
*/

运算符重载的限制

可重载的一元运算符:+ - ! ~ ++ -- true false
可重载的二元运算符:+ - * / % & | ^ << >> == != > < >= <=

typeof运算符

运算符 描述
typeof 返回已知类型的 System.Type 对象
  • typeof(T):编译时获取类型,作用于类型本身;
  • obj.GetType():运行时获取对象实际类型,作用于实例;

nameof运算符

运算符 描述
nameof 返回用来表示变量、类型或者成员的字符串

其他运算符

可空类型

  • 空接合运算符
  • 空条件运算符