📜  无法从 switch 语句跳转到这种情况标签 c++ (1)

📅  最后修改于: 2023-12-03 15:26:15.660000             🧑  作者: Mango

无法从 switch 语句跳转到这种情况标签 C++

在 C++ 中,使用 switch 语句时,如果在 case 子句中使用了 goto 语句跳转到 switch 语句外的标签,会出现“无法从 switch 语句跳转到这种情况标签”的编译错误。

这是因为 switch 语句有自己的语法和流程控制,不能够跨越 case 子句去到达其他标签。

下面我们将通过代码片段演示这个错误和如何避免它。

#include <iostream>

int main() {
    int num = 3;
    switch (num) {
        case 1:
            std::cout << "Number is 1." << std::endl;
            break;
        case 2:
            std::cout << "Number is 2." << std::endl;
            goto label; // 跳转到标签
            break;
        case 3:
            std::cout << "Number is 3." << std::endl;
            break;
    }
    std::cout << "Switch statement ended." << std::endl;

label:
    std::cout << "Goto label executed." << std::endl;
    return 0;
}

这段代码中,在 switch 语句的第二个 case 子句中使用了 goto 语句跳转到了标签 label,但是这样的代码是不被允许的,编译器会提示“无法从 switch 语句跳转到这种情况标签”的错误。

为了避免这种错误,我们应该尽量避免使用 goto 语句,改用其他方式实现代码逻辑。在上面的代码中,可以将 case 2 中的代码放到一个函数中,然后在 case 2 中直接调用该函数,避免了跳转到其他的标签。

#include <iostream>

void case2() {
    std::cout << "Number is 2." << std::endl;
}

int main() {
    int num = 3;
    switch (num) {
        case 1:
            std::cout << "Number is 1." << std::endl;
            break;
        case 2:
            case2(); // 直接调用函数
            break;
        case 3:
            std::cout << "Number is 3." << std::endl;
            break;
    }
    std::cout << "Switch statement ended." << std::endl;

    return 0;
}

通过将 case 2 中的代码放在了函数 case2() 中,并在 switch 语句中直接调用该函数,可以避免“无法从 switch 语句跳转到这种情况标签”的错误,使代码更加清晰、易读。