C表达式与运算符全面解析
立即解锁
发布时间: 2025-08-21 00:06:06 阅读量: 3 订阅数: 8 


C#编程基础与实战技巧
### C# 表达式与运算符全面解析
#### 1. 字符串字面量
字符串字面量使用双引号,而非字符字面量使用的单引号。它主要分为以下两种类型:
- **常规字符串字面量**:由双引号之间的字符序列组成,可包含字符、简单转义序列、十六进制和 Unicode 转义序列。例如:
```csharp
string st1 = "Hi there!";
string st2 = "Val1\t5, Val2\t10";
string st3 = "Add\x000ASome\u0007Interest";
```
- **逐字字符串字面量**:写法与常规字符串字面量类似,但前面带有 `@` 字符。其重要特点如下:
- 与常规字符串字面量不同,转义序列不会被求值,双引号内的所有内容(包括通常被视为转义序列的内容)都会按原样输出。
- 唯一的例外是连续的双引号,会被解释为单个双引号字符。
以下是常规字符串字面量和逐字字符串字面量的比较示例:
```csharp
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";
```
打印这些字符串的输出如下:
```plaintext
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
```
编译器会让相同的字符串字面量共享堆中的同一内存位置,从而节省内存。
#### 2. 表达式的计算顺序
表达式可由多个嵌套的子表达式组成,子表达式的计算顺序会影响表达式的最终值。例如,对于表达式 `3 * 5 + 2`,根据子表达式的计算顺序不同,会有两种可能的结果:
- 先进行乘法运算,结果为 17。
- 先将 5 和 2 相加,结果为 21。
#### 3. 运算符优先级
在 C# 中,运算符优先级较为复杂,有超过 45 个运算符和 14 个优先级级别。以下是运算符优先级从高到低的完整列表:
| 类别 | 运算符 |
| ---- | ---- |
| 主要运算符 | a.x, f(x), a[x], x++, x--, new, typeof, checked, unchecked |
| 一元运算符 | +, -, !, ~, ++x, --x, (T)x |
| 乘法运算符 | *, /, % |
| 加法运算符 | +, - |
| 移位运算符 | <<, >> |
| 关系和类型运算符 | <, >, <=, >=, is, as |
| 相等运算符 | ==, != |
| 逻辑与运算符 | & |
| 逻辑异或运算符 | ^ |
| 逻辑或运算符 | \| |
| 条件与运算符 | && |
| 条件或运算符 | \|\| |
| 条件运算符 | ?: |
| 赋值运算符 | =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, \|= |
#### 4. 运算符结合性
如果表达式中的所有运算符具有不同的优先级,则从优先级最高的子表达式开始计算,逐步降低优先级。但如果两个连续的运算符具有相同的优先级,计算顺序由运算符的结合性决定。运算符结合性的重要特点如下:
- 左结合运算符从左到右计算。
- 右结合运算符从右到左计算。
- 除赋值运算符外的二元运算符是左结合的。
- 赋值运算符和条件运算符是右结合的。
例如,对于表达式 `2 / 6 * 4`,根据左结合规则,应先计算 `(2 / 6)`,再乘以 4,结果为 `4/3`。
可以使用括号显式设置表达式中子表达式的计算顺序,括号内的子表达式会覆盖优先级和结合性规则,并从最内层嵌套集开始按顺序计算到最外层。
#### 5. 简单算术运算符
简单算术运算符执行四种基本算术运算,它们是二元且左结合的。具体如下表所示:
| 运算符 | 名称 | 描述 |
| ---- | ---- | ---- |
| + | 加法 | 将两个操作数相加 |
| - | 减法 | 从第一个操作数中减去第二个操作数 |
| * | 乘法 | 将两个操作数相乘 |
| / | 除法 | 用第一个操作数除以第二个操作数,整数除法会将结果向 0 舍入到最接近的整数 |
以下是简单算术运算符的示例:
```csharp
int x1 = 5 + 6; double d1 = 5.0 + 6.0;
int x2 = 12 - 3; double d2 = 12.0 - 3.0;
int x3 = 3 * 4; double d3 = 3.0 * 4.0;
int x4 = 10 / 3; double d4 = 10.0 / 3.0;
byte b1 = 5 + 6;
sbyte sb1 = 6 * 5;
```
#### 6. 取余运算符
取余运算符 `%` 用于用第一个操作数除以第二个操作数,忽略商,返回余数。它是二元且左结合的。例如:
```plaintext
0 % 3 = 0,因为 0 除以 3 商为 0,余数为 0。
1 % 3 = 1,因为 1 除以 3 商为 0,余数为 1。
2 % 3 = 2,因为 2 除以 3 商为 0,余数为 2。
3 % 3 = 0,因为 3 除以 3 商为 1,余数为 0。
4 % 3 = 1,因为 4 除以 3 商为 1,余数为 1。
```
取余运算符也可用于实数,给出实数余数。示例代码如下:
```csharp
Console.WriteLine("0.0f % 1.5f is {0}" , 0.0f % 1.5f);
Console.WriteLine("0.5f % 1.5f is {0}" , 0.5f % 1.5f);
Console.WriteLine("1.0f % 1.5f is {0}" , 1.0f % 1.5f);
Console.WriteLine("1.5f % 1.5f is {0}" , 1.5f % 1.5f);
Console.WriteLine("2.0f % 1.5f is {0}" , 2.0f % 1.5f);
Console.WriteLine("2.5f % 1.5f is {0}" , 2.5f % 1.5f);
```
输出结果为:
```plaintext
0.0f % 1.5f is 0 // 0.0 / 1.5 = 0 remainder 0
0.5f % 1.5f is 0.5 // 0.5 / 1.5 = 0 remainder .5
1.0f % 1.5f is 1 // 1.0 / 1.5 = 0 remainder 1
1.5f % 1.5f is 0 // 1.5 / 1.5 = 1 remainder 0
2.0f % 1.5f is 0.5 // 2.0 / 1.5 = 1 remainder .5
2.5f % 1.
```
0
0
复制全文
相关推荐










