深入理解switch/case语句
立即解锁
发布时间: 2025-08-22 01:33:34 阅读量: 2 订阅数: 7 


编写出色代码:低层次思考,高层次写作
### 深入理解 switch/case 语句
#### 1. switch/case 语句简介
在高级编程语言(HLL)中,`switch/case` 语句是一种条件语句。与 `if` 语句不同,`if` 语句测试布尔表达式,并根据表达式的结果执行代码中的两条不同路径之一;而 `switch/case` 语句可以根据序数(整数)表达式的结果分支到代码中的几个不同点。
以下是不同语言中 `switch/case` 语句的示例:
- **C/C++ 中的 `switch` 语句**
```c
switch( expression )
{
case 0:
<< statements to execute if the
expression evaluates to zero >>
break;
case 1:
<< statements to execute if the
expression evaluates to one >>
break;
case 2:
<< statements to execute if the
expression evaluates to two >>
break;
<<etc>>
default:
<< statements to execute if the expression is
not equal to any of these cases >>
}
```
- **Pascal 中的 `case` 语句**
```pascal
case ( expression ) of
0: begin
<< statements to execute if the
expression evaluates to zero >>
end;
1: begin
<< statements to execute if the
expression evaluates to one >>
end;
2: begin
<< statements to execute if the
expression evaluates to two >>
end;
<<etc>>
end; (* case *)
```
- **HLA 中的 `switch` 语句**
```hla
switch( REG32 )
case( 0 )
<< statements to execute if
EAX contains zero >>
case( 1 )
<< statements to execute
REG32 contains one >>
case( 2 )
<< statements to execute if
REG32 contains two >>
<<etc>>
default
<< statements to execute if
REG32 is not equal to any of these cases >>
endswitch;
```
从这些示例可以看出,这些语句都有相似的语法。
#### 2. switch/case 语句的语义
在大多数编程入门课程和教科书中,通常通过将 `switch/case` 语句与 `if..else..if` 语句链进行比较来讲解其语义。例如,下面的 Pascal 代码被认为与前面的 `case` 语句等效:
```pascal
if( expression = 0 ) then begin
<< statements to execute if expression is zero >>
end
else if( expression = 1 ) then begin
<< statements to execute if expression is one >>
end
else if( expression = 2 ) then begin
<< statements to execute if expression is two >>
end;
```
虽然这个特定的序列会达到与 `case` 语句相同的结果,但 `if..then..elseif` 序列和 `case` 实现之间存在几个根本区别:
- **常量限制**:`case` 语句中的 `case` 标签必须都是常量,而在 `if..then..elseif` 链中,可以将变量和其他非常量值与控制变量进行比较。
- **单一表达式比较**:`switch/case` 语句只能将单个表达式的值与一组常量进行比较,不能像 `if..then..elseif` 链那样,对一个 `case` 比较一个表达式与一个常量,对另一个 `case` 比较另一个表达式与第二个常量。
#### 3. 跳转表与链式比较
虽然 `switch/case` 语句比 `if..then..elseif` 链更具可读性和便利性,但它最初被添加到高级语言中是为了提高效率。
考虑一个有十个不同表达式要测试的 `if..then..elseif` 链,如果所有情况都是互斥且等可能的,那么平均来说,程序在遇到一个求值为 `True` 的表达式之前将执行五次比较。
而在汇编语言中,可以通过使用表查找和间接跳转,在固定的时间内将控制转移到几个不同的位置,而与情况的数量无关。以下是一个简单的汇编语言实现 `switch/case` 语句的示例:
```asm
// Conversion of
// switch(i)
// { case 0:...case 1:...case 2:...case 3:...}
// into assembly
static
jmpTable: dword[4] :=
{ &label0, &label1, &label2, &label3 };
.
.
.
// jmps to address specified by jmpTable[i]
mov( i, eax );
jmp( jmpTable[ eax*4 ] );
label0:
<< code to execute if i = 0 >>
jmp switchDone;
label1:
<< code to execute if i = 1 >>
jmp switchDone;
label2:
<< code to execute if i = 2 >>
jmp switchDone;
label3:
<< code to execute if i = 3 >>
switchDone:
<< Code that follows the switch statement >>
```
这个代码的执行过程如下:
1. `jmpTable` 声明定义了一个包含四个双字指针的数组,每个指针对应 `switch` 语句模拟中的一个 `case`。
2. 第一条机器指令将 `switch` 表达式(变量 `i` 的值)加载到 `EAX` 寄存器中。
3. 下一条 `jmp` 指令跳转到 `jmpTable` 数组中由 `EAX` 索引的条目中指定的地址。
与 `if..then..elseif` 实现相比,这种跳转表实现有以下优点和缺点:
| 比较项 | 跳转表实现 | if..then..elseif 实现 |
| ---- | ---- | ---- |
| 执行时间 | 当情况较多时,执行时间固定,与情况数量无关 | 随着情况数量增加,执行时间逐渐变长 |
| 内存使用 | 可能需要大量内存,尤其是情况值分散时 | 相对较少 |
0
0
复制全文
相关推荐










