switch (false)
{
case true:
int jval;
break;
case false:
jval = 18;
cout << jval;
break;
}
在这种情况下,任何人都可以帮助我理解为什么我能够访问jval吗?
答案 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)
变量范围是大括号之间的部分,而不是case
和break
之间的部分
因此,在一个案例中声明的变量在所有后续情况下都在范围内。
如果使用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;
}
因为你不允许跳过变量初始化。