为什么我们可以访问交换机的其他案例标签内的变量?

时间:2018-02-05 17:34:14

标签: c++

switch (false)
{
case true:
    int jval;
    break;

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

}

在这种情况下,任何人都可以帮助我理解为什么我能够访问jval吗?

2 个答案:

答案 0 :(得分:2)

案例只是标签,而break只是意味着跳转到开关范围块的末尾 变量的生命周期在范围块(})内,从声明的位置到结束case

此外,如果您没有放入中断并输入第一个case语句,程序流将转到下一个。
因此,第二个{ }语句中的代码可以访问该变量。

如果您不想访问它,请在另一个$ git log --oneline --reverse @{u}.. 00f53a2 echo >master6 afcef3e echo >master7 1f55c48 echo >master8 c3197a0 echo >master9 d30bb35 (HEAD -> master) echo >master10 $ GIT_SEQUENCE_EDITOR='sed -i 5s/pick/squash/' git rebase -i [detached HEAD 16dc80d] echo >master9 Date: Mon Feb 5 09:25:55 2018 -0800 2 files changed, 2 insertions(+) create mode 100644 master10 create mode 100644 master9 Successfully rebased and updated refs/heads/master. $ git log --oneline --reverse @{u}.. 00f53a2 echo >master6 afcef3e echo >master7 1f55c48 echo >master8 16dc80d (HEAD -> master) echo >master9 $ 范围块中保护它,以限制它的使用寿命。

答案 1 :(得分:2)

变量范围是大括号之间的部分,而不是casebreak之间的部分 因此,在一个案例中声明的变量在所有后续情况下都在范围内。

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

// "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翻译成 - 一系列跳跃和一个简单的变换体。)

请注意,如果您尝试初始化jval

,则会收到错误消息
switch (false)
{
case true:
    int jval = 13;   // Nope.
    cout << jval
    break;
case false:
    jval = 18;
    cout << jval;
    break;
}

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