为什么可以在'default'下的switch语句中定义变量,但不能在'case'下定义

时间:2017-10-04 19:36:44

标签: c++ switch-statement

understand为什么我无法在'case'下定义变量,但为什么我可以在'default'下定义一个变量呢?我认为这是另一个标签,就像“案例”一样。

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

4 个答案:

答案 0 :(得分:4)

尝试重新排序您的案例:

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

现在您将看到编译器抱怨b,而不是adefault没有什么神奇之处,只是如果你在最后一个case语句中定义变量,那么就没有办法跳过该变量的初始化,所以它完全没问题。这样做。

您可以随时查看案例范围,以便在案例之外无法访问变量,如果这是您的意图:

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

答案 1 :(得分:3)

您无法在case 0下定义它,因为跳转到默认标签(which is what a switch statement does)会跳过a的初始化。

C ++禁止这样的跳过。如果在块中初始化了变量,那么控制不能到达初始化之后的块内的某个点,而不会预先形成它。

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

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

答案 2 :(得分:0)

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

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

它与C ++标准有关。 更多信息Cross initialization

答案 3 :(得分:0)

您也可以这样做:

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