为什么您可以在 switch 语句中的"默认"下定义变量,而不能在"case"下定义变量

Why can you define a variable in a switch statement under 'default' but not under 'case'

本文关键字:变量 下定义 默认 case 不能 switch 语句 为什么      更新时间:2023-10-16

我明白为什么我不能在'case'下定义一个变量,但是为什么我可以在'默认值下定义一个变量呢?我认为这是另一个标签,就像"案例"。

switch(myVar)
{
    case 0:
        int a = 12; //error
        break;
    default:
        int b = 42; //OK
}

尝试重新排序您的案例:

switch(myVar)
{
    default:
        int b = 42; // error
        break;
    case 0:
        int a = 12; // ok
}

现在,您将看到编译器抱怨b,而不是adefault没有什么神奇的,只是如果您在上一个案例语句中定义了变量,那么就无法跳过该变量的初始化,因此这样做是完全可以的。

您始终可以调查案件,以便在案件之外无法访问变量,如果是您的意图:

switch(myVar)
{
    case 0: {
        int a = 12;
    }
    break;
    default:
        int b = 42;
}

您无法在case 0下定义它,因为跳到默认标签(这是Switch语句所做的)将跳过a的初始化。

C 禁止这样的跳过。如果在一个块中初始化了变量,则控件将无法进入超过初始化的块内部的点,而无需预先形成。

但是,由于 int是没有构造函数的类型,因此,如果省略了初始化器,则可以定义变量:

switch(myvar)
{
    case 0:
        int a; //OK too
        break;
    default:
        int b = 42; //OK
}

在开关语句之前初始化所有变量。

int a = 0;
switch(myVar)
{
    case 0:
        a = 12; //now ok
        break;
    default:
        int b = 42; //OK
}

它与C 标准有关。更多信息在这里交叉初始化

您也可以做到这一点:

switch(myVar)
{
    case 0:
    {
        int a = 0;
    }
    break;
    default:
        int b = 42; //OK
}