在 C++ 中,switch 语句的每个 case 标签几乎是作为跳转目标处理的,因此控制流可能会跨越多个 case 标签。这意味着如果您在 case 语句内部定义了一个变量,那么该变量将在 case 结束后仍然存在于其作用域中,而不是在每个 case 的块内部。这可能会导致一些问题。

变量作用域问题

如果您在 switch 的某个 case 语句中定义了一个变量,您不能在另一个 case 语句中再次定义同名变量,除非您使用嵌套块(如用 {} 包起来)。否则,编译器会报错,提示重复定义。

#include <iostream>  

int main() {  
    int value = 1;  

    switch (value) {  
        case 1: {  
            int x = 5;  // 定义在case 1中  
            std::cout << "Case 1: x = " << x << std::endl;  
            // break;  // 如果没有 break,跳转到 case 2  
        }  
        case 2: {  
            int x = 10;  // 这时会导致编译错误,x 已在 case 1 中定义  
            std::cout << "Case 2: x = " << x << std::endl;  
        }  
        default:  
            std::cout << "Default case" << std::endl;  
            break;  
    }  

    return 0;  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.

解决方法

  1. 使用局部块:在每个 case 中使用 {} 来明确一个局部作用域。这样,您可以在不同的 case 中定义同名变量。
#include <iostream>  

int main() {  
    int value = 1;  

    switch (value) {  
        case 1: {  
            int x = 5;  // case 1 中的 x  
            std::cout << "Case 1: x = " << x << std::endl;  
            break; // 添加 break  
        }  
        case 2: {  
            int x = 10;  // case 2 中的 x  
            std::cout << "Case 2: x = " << x << std::endl;  
            break; // 添加 break  
        }  
        default:  
            std::cout << "Default case" << std::endl;  
            break;  
    }  

    return 0;  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  1. 在外部作用域定义变量:您可以在 switch 外定义变量,然后在每个 case 中赋值。
#include <iostream>  

int main() {  
    int value = 1;  
    int x;  // 在 switch 语句外定义  

    switch (value) {  
        case 1:  
            x = 5;  // case 1 中赋值  
            std::cout << "Case 1: x = " << x << std::endl;  
            break;  
        case 2:  
            x = 10;  // case 2 中赋值  
            std::cout << "Case 2: x = " << x << std::endl;  
            break;  
        default:  
            std::cout << "Default case" << std::endl;  
            break;  
    }  

    return 0;  
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.