C++ 为什么我们可以访问交换机的其他case标签中的变量?

C++ 为什么我们可以访问交换机的其他case标签中的变量?,c++,C++,有人能帮我理解为什么在这种情况下我可以访问jval吗 案例只是标签,而break只是指跳转到switch scope块的末尾。 变量的生存期在范围块{}内,从声明位置到结束位置} 此外,如果您不输入break并输入第一个case语句,程序流将传递到下一个case语句。 第二个case语句中的代码访问了该变量 如果您不想访问它,请在另一个{}范围块中保护它,以限制它的使用寿命。变量范围是花括号之间的部分,而不是大小写和分隔符之间的部分。 因此,在一种情况下声明的变量在所有后续情况下都在范围内 如果

有人能帮我理解为什么在这种情况下我可以访问jval吗

案例只是标签,而break只是指跳转到switch scope块的末尾。 变量的生存期在范围块{}内,从声明位置到结束位置}

此外,如果您不输入break并输入第一个case语句,程序流将传递到下一个case语句。 第二个case语句中的代码访问了该变量


如果您不想访问它,请在另一个{}范围块中保护它,以限制它的使用寿命。

变量范围是花括号之间的部分,而不是大小写和分隔符之间的部分。 因此,在一种情况下声明的变量在所有后续情况下都在范围内

如果您使用goto查看等效公式,可能会更清楚:


因为不允许跳过变量初始化

因为您没有将案例结果包装在{}中,因此定义了范围。10001在案例陈述之后始终使用{}的原因;第三,这感觉像是C.Legal留下的一个深深的黑暗角落,但不是我想看到的东西。它是可见的,因为case语句不定义它们自己的范围,因此我们接受了使用大括号的培训。您没有收到警告吗?如果没有,请使用GCC/Clang尝试-Wall-Wextra。@Nawaz GCC 7、Clang 5和MSVC 19都不会对此产生警告,除非您提供其他警告标志。不必执行变量声明,它们只是块的一部分。如果它包含一个初始化,除非您执行它,否则无法完成初始化。
switch (false)
{
case true:
    int jval;
    break;

case false:
    jval = 18;
    cout << jval;
    break;

}
// "Jump table"
if (false == true)
    goto case_true;
if (false == false)
    goto case_false;
goto switch_end;
// switch body begins here.
{
case_true:
    int jval;
    goto switch_end;

case_false:
    jval = 18;
    cout << jval;
    goto switch_end;
}
// switch ends here.
switch_end:
switch (false)
{
case true:
    int jval = 13;   // Nope.
    cout << jval
    break;
case false:
    jval = 18;
    cout << jval;
    break;
}