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

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

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

语法:

// Switch Case语句语法
switch (n) {
  
// 如果n = 1,则执行以下代码
case 1:
    break;
  
// 如果n = 2,则执行以下代码
case 2:
    break;
  
// 如果n不匹配任何情况,则执行以下代码
default:
}  

要点:

  1. Switch接受输入参数并选择一个case。
  2. 在case中使用的表达式应为常量类型。
  3. case外的语句将不会被执行。

本文重点介绍第三个语句“case外的语句将不会被执行”。

示例1: 预测以下程序的输出:

// C程序演示Switch Case语句
#include <stdio.h>
  
// 驱动程序
int main()
{
    switch (1) {
        int test = 10;
        printf("dead code\n");
    case 1:
        printf("%d\n", test);
    }
  
    return 0;
}  

0

说明: 尽管test的值应为10,但输出的是垃圾值。很明显,case 1之前的打印语句被忽略了(可能是在代码优化的一部分中被移除的死代码消除),因此可以得出结论,也不执行前面的语句。这意味着变量test **** 没有定义。是真的吗?让我们看看。

分析器和符号表: 词法分析是编译器的第一阶段,也称为扫描器或分析器。它将高级输入程序转换为一系列令牌。这些令牌可以是不同类型的。符号表是编译器创建和维护的数据结构。它存储有关名称的范围和绑定信息以及有关各种实体的实例的信息,例如变量和函数名称、类、对象等等。

符号表中有很多列,但为简单起见,让我们取“变量名称”和“地址”字段。

示例1: int x = 5;

词法分析器:
int – 关键字
x – 标识符
= – 运算符
5 – 常量
; – 特殊符号

符号表:
———————————————-
| 变量名称 | 地址 |
———————————————-
| x | 0 |
———————————————-

示例2:

void main(int a)
{
int b = a;
}

词法分析器:

void – 关键字
main – 标识符
() – 特殊符号
{} – 特殊符号
int – 关键字
a – 标识符
b – 标识符
= – 运算符
; – 特殊符号

符号表:
———————————————-
| 变量名称 | 地址 |
———————————————-
| main | 0 |
———————————————-
| a | 4 |
———————————————-
| b | 8 |
———————————————-

如果在Case外部的if语句不被执行,那么如何在不声明变量“test”的情况下使用它?让我们看看这行如何绕过编译的分析阶段。

词法分析器: Lexer将正常解析整个程序。在此阶段创建符号表,因此将变量 test 识别为令牌并添加到符号表中。

———————————————-
| 变量名称 | 地址 |
———————————————-
| test | 0 |
———————————————-

语法分析器: 检查整个程序的语法。就结构而言,我们的程序是完全正常的。到目前为止没有错误。

语义分析器: 将尝试为语法树分配含义。 将变量 test 分配为整数类型,并成功地绕过所有分析阶段。

——————————————————————
| 变量名称 | 地址 | 类型 |
——————————————————————
| test | 0 | int |
——————————————————————

现在标识符 test 已成功占据符号表中的一个位置。 符号表在运行时填充值,但是因为在运行时第5行和第6行不会被执行,变量test的值不会更新。 因此,我们得到一些垃圾值作为输出。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程