📜  如何在 switch 块内但在 case 外处理语句

📅  最后修改于: 2022-05-13 01:55:34.667000             🧑  作者: Mango

如何在 switch 块内但在 case 外处理语句

Switch case 语句替代了将变量与多个整数值进行比较的长 if 语句。 switch 语句是一个多路分支语句。它提供了一种简单的方法,可以根据表达式的值将执行分派到代码的不同部分。它是一个控制语句,允许一个值改变执行的控制。

句法:

想要从精选的视频和练习题中学习,请查看C++ 基础课程,从基础到高级 C++ 和C++ STL 课程,了解基础加 STL。要完成从学习语言到 DS Algo 等的准备工作,请参阅完整的面试准备课程
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;
}


关键点:

  1. Switch 接受一个输入参数并选择一个案例。
  2. 案例中使用的表达式应该是一个常量类型。
  3. 任何情况之外的语句都不会被执行。

本文重点介绍第三个语句“任何情况外的语句都不会被执行”。

示例 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;

示例 2:

如果没有执行 Case 之外的语句,如何在不声明的情况下使用变量“test”?让我们看看这条线如何绕过编译的分析阶段。

词法分析器:词法分析器将正常解析整个程序。这是创建符号表的阶段,因此变量test被识别为标记并添加到符号表中。

语法分析器查看整个程序的语法。从结构上讲,我们的程序非常好。到现在都没有报错。

语义分析器 将尝试为解析树分配含义。变量test被指定为整数类型,并已成功绕过所有分析阶段。

现在标识符测试已经成功地在符号表中占据了一席之地。符号表在运行时填充了值,但由于在运行时第 5 行和第 6 行未执行,变量 test 的值未更新。因此我们得到一些垃圾值作为输出。