如何在 switch 块内但在 case 外处理语句
Switch case 语句替代了将变量与多个整数值进行比较的长 if 语句。 switch 语句是一个多路分支语句。它提供了一种简单的方法,可以根据表达式的值将执行分派到代码的不同部分。它是一个控制语句,允许一个值改变执行的控制。
句法:
C++
// Syntax for Switch Case
switch (n) {
// code to be executed if n = 1
case 1:
break;
// code to be executed if n = 2
case 2:
break;
// code to be executed if n
// doesn't match any cases
default:
}
C
// C program to illustrate the switch statement
#include
// Driver Code
int main()
{
switch (1) {
int test = 10;
printf("dead code\n");
case 1:
printf("%d\n", test);
}
return 0;
}
关键点:
- Switch 接受一个输入参数并选择一个案例。
- 案例中使用的表达式应该是一个常量类型。
- 任何情况之外的语句都不会被执行。
本文重点介绍第三个语句“任何情况外的语句都不会被执行”。
示例 1:预测以下程序的输出:
C
// C program to illustrate the switch statement
#include
// Driver Code
int main()
{
switch (1) {
int test = 10;
printf("dead code\n");
case 1:
printf("%d\n", test);
}
return 0;
}
说明:即使 test 的值应该是 10,也获得了垃圾值作为输出。 可以清楚地看到 case 1 之前的打印语句被忽略(可能在代码优化期间作为死代码消除的一部分被删除)所以可以断定前面的语句也没有执行。这意味着变量测试 未声明。这是真的吗?让我们来看看。
分析器和符号表:词法分析是编译器的第一阶段,也称为扫描器或分析器。它将高级输入程序转换为一系列令牌。这些令牌可以是不同的类型。符号表是由编译器创建和维护的数据结构。它存储有关范围的信息和有关名称的绑定信息,有关各种实体(例如变量和函数名称、类、对象等)的实例的信息。
符号表中有许多列,但为简单起见,我们采用“变量名”和“地址”字段。
示例 1: int x = 5;
Lexical Analyzer:
int – keyword
x – identifier
= – operator
5 – constant
; – special symbol
Symbol Table:
———————————————-
| variable name | address |
———————————————-
| x | 0 |
———————————————-
示例 2:
void main(int a)
{
int b = a;
}
Lexical Analyzer:
void- keyword
main – identifier
() – special symbol
{} – special symbol
int – keyword
a – identifier
b – identifier
= – operator
; – special symbol
Symbol Table-
———————————————-
| variable name | address |
———————————————-
| main | 0 |
———————————————-
| a | 4 |
———————————————-
| b | 8 |
———————————————-
如果没有执行 Case 之外的语句,如何在不声明的情况下使用变量“test”?让我们看看这条线如何绕过编译的分析阶段。
词法分析器:词法分析器将正常解析整个程序。这是创建符号表的阶段,因此变量test被识别为标记并添加到符号表中。
———————————————-
| variable name | address |
———————————————-
| test | 0 |
———————————————-
语法分析器:查看整个程序的语法。从结构上讲,我们的程序非常好。到现在都没有报错。
语义分析器:它 将尝试为解析树分配含义。变量test被指定为整数类型,并已成功绕过所有分析阶段。
——————————————————————
| variable name | address | type |
——————————————————————
| test | 0 | int |
——————————————————————
现在标识符测试已经成功地在符号表中占据了一席之地。符号表在运行时填充了值,但由于在运行时第 5 行和第 6 行未执行,变量 test 的值未更新。因此我们得到一些垃圾值作为输出。