C表达式、运算符与语句详解
立即解锁
发布时间: 2025-08-21 00:06:06 阅读量: 2 订阅数: 8 


C#编程基础与实战技巧
### C# 表达式、运算符与语句详解
#### 一、赋值运算符
赋值运算符用于计算运算符右侧的表达式,并将该值赋给左侧的变量表达式。赋值运算符是二元且右结合的。以下是赋值运算符的列表:
| 运算符 | 描述 |
| --- | --- |
| = | 简单赋值;计算右侧表达式,并将返回值赋给左侧的变量或表达式。 |
| *= | 复合赋值;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)。 |
语法如下:
```csharp
VariableExpression Operator Expression
```
对于简单赋值,会计算运算符右侧的表达式,并将其值赋给左侧的变量。例如:
```csharp
int x;
x = 5;
x = y * z;
```
赋值运算符左侧可以是以下类型的对象:
- 变量(局部变量、字段、参数)
- 属性
- 索引器
- 事件
复合赋值运算符提供了一种简写方法,可避免在某些常见情况下右侧重复使用左侧的变量。例如:
```csharp
x = x + (y – z);
x += y – z;
```
这两条语句语义上是等价的,但第二条更简短且易于理解。其他复合赋值语句类似:
```csharp
x *= y – z; // 等同于 x = x * (y – z)
x /= y – z; // 等同于 x = x / (y – z)
```
#### 二、条件运算符
条件运算符是一种强大而简洁的方式,可根据条件的结果返回两个值之一。它是三元运算符,如下表所示:
| 运算符 | 名称 | 描述 |
| --- | --- | --- |
|? : | 条件运算符 | 计算一个表达式,并根据该表达式返回 true 或 false 返回两个值之一。 |
语法如下:
```csharp
Condition ? Expression1 : Expression2
```
其中,Condition 必须返回 bool 类型的值。如果 Condition 计算结果为 true,则计算并返回 Expression1;否则,计算并返回 Expression2。
条件运算符可以与 if...else 结构进行比较。例如,以下 if...else 结构检查条件,如果条件为 true,则将 5 赋给变量 intVar;否则,将其赋值为 10:
```csharp
if ( x < y )
intVar = 5;
else
intVar = 10;
```
使用条件运算符可以以更简洁的形式执行相同的操作:
```csharp
intVar = x < y ? 5 : 10;
```
将条件和每个返回表达式放在不同的行上,代码的意图会更清晰:
```csharp
intVar = x < y
? 5
: 10 ;
```
以下代码多次使用条件运算符:
```csharp
int x = 10, y = 9;
int highVal = x > y
? x
: y;
Console.WriteLine("highVal: {0}\n" , highVal);
Console.WriteLine("x is{0} greater than y" ,
x > y
? ""
: " not" );
y = 11;
Console.WriteLine("x is{0} greater than y" ,
x > y
? ""
: " not" );
```
输出结果为:
```
highVal: 10
x is greater than y
x is not greater than y
```
需要注意的是,if...else 语句是控制流语句,用于执行两个操作之一;而条件运算符返回一个表达式,用于返回两个值之一。
#### 三、一元算术运算符
一元运算符用于设置数值的符号,如下表所示:
| 运算符 | 名称 | 描述 |
| --- | --- | --- |
| + | 正号 | 返回操作数的数值。 |
| - | 负号 | 返回 0 减去操作数的数值。 |
例如:
```csharp
int x = +10; // x = 10
int y = -x; // y = -10
int z = -y; // z = 10
```
#### 四、用户定义的类型转换
可以为自己的类和结构体定义隐式和显式转换,这允许将用户定义类型的对象转换为其他类型,反之亦然。C# 提供了隐式和显式转换:
- 隐式转换:编译器在解析特定上下文中使用的类型时,如有必要会自动进行转换。
- 显式转换:编译器仅在使用显式强制转换运算符时才会进行转换。
声明隐式转换的语法如下:
```csharp
public static implicit operator TargetType ( SourceType Identifier )
{
...
return ObjectOfTargetType;
}
```
显式转换的语法相同,只是将 implicit 替换为 explicit。
以下是将 LimitedInt 类型的对象转换为 int 类型,反之亦然的示例:
```csharp
class LimitedInt
{
public static implicit operator int (LimitedInt li) // LimitedInt 到 int
{
return li.TheValue;
}
public static implicit operator LimitedInt (int x) // int 到 LimitedInt
{
LimitedInt li = new LimitedInt();
li.TheValue = x;
return li;
}
private int _theValue = 0;
public int TheValue{ ... }
}
```
在 Main 方法中使用这些转换运算符:
```csharp
class Program
{
static void Main()
{
LimitedInt li = 500; // 将 500 转换为 LimitedInt
int value = li; // 将 LimitedInt 转换为 int
Console.WriteLine("li: {0}, value: {1}" , li.TheValue, value);
}
}
```
输出结果为:
```
li: 100, value: 100
```
#### 五、显式转换和强制转换运算符
如果将上述两个转换运算符声明为显式的,则在进行转换时必须显式使用强制转换运算符。强制转换运算符由要将表达式转换为的类型名称放在括号内组成。例如:
```csharp
LimitedInt li = (LimitedInt) 500;
```
修改后的代码如下:
```csharp
public static explicit operator int(LimitedInt li)
{
return li.TheValue;
}
public static explicit operator LimitedInt(int x)
{
LimitedInt li = new LimitedInt();
li.TheValue = x;
return li;
}
static void Main()
{
LimitedInt li = (LimitedInt) 500;
int value = (int) li;
Console.WriteLine("li: {0}, value: {1}" , li.TheValue, value);
}
```
输出结果与之前相同:
```
li: 100, value: 100
```
#### 六、运算符重载
C# 运算符是为预定义类型的操作数定义的。运算符重载允许定义 C# 运算符如何对用户定义类型的操作数进行操作。运算符重载仅适用于类和结构体。可以通过声明一个名为 operator x 的方法来重载运算符 x,实现其行为。
- 一元运算符的重载方法接受一个类或结构体类型的单个参数。
- 二元运算符的重载方法接受两个参数,其中至少一个必须是类或结构体类型。
例如:
```csharp
public static LimitedInt opera
```
0
0
复制全文
相关推荐









