C++:switch case 中的初始化并不总是给出错误

C++: Initialization within switch case is not consistently giving out error

我读到在 switch 情况下的初始化应该会导致编译器错误。 但是当我尝试两个不同的版本时。一个是不报错(Ex1),我不明白为什么。

示例 1:

switch (i)
{
case 1:
    int k;
    break;
case 2:
    int j=3;
    break;
}

Ex2:

switch (i)
{
case 1:
    int k=3;
    break;
case 2:
    int j;
    break;
}

在 switch 块中,case 之前的每个声明在 case 处可用。当有一个 case 时,switch 可以跳转到该 case,而该 switch 位于您可以在那里访问的变量初始化之后。如果跳转到 case,您可以使用该变量,尽管它从未发生过初始化。

在第一个示例中,没有 case 会跳过初始化。唯一的初始化是 int j=3;,它在每个 case 之后出现,所以它不能被跳过。 k 未初始化,因此无法跳过其初始化。

在第二个例子中,如果 i == 2 那么 k 的初始化将被跳过。

一个解决方案是为每个案例定义一个范围。那么,为 case 定义的变量只能从 case 访问,问题就不会发生。例如:

void foo(int i)
{
    switch (i)
    {
    case 1:
    {
        int k=3;
        break;
    }
    case 2:
    {
        // k is not accessible here
        int j;
        break;
    }
    }
}