int i;
i = 2;
switch(i)
{
case 1:
int k;
break;
case 2:
k = 1;
cout<<k<<endl;
break;
}
我不知道为什么上面的代码有效。
在这里,我们永远不能讨论案例1,但为什么我们可以在案例2中使用k
?
答案 0 :(得分:2)
实际上有两个问题:
<强> 1。为什么我可以在case
标签后声明变量?
这是因为在C ++标签中必须采用以下形式:
N3337 6.1 / 1
标记的语句:
...
- attribute-specifier-seqopt
case
constant-expression
:statement
...
在C++
声明声明中也被视为声明(与C
相对):
N3337 6/1:
语句:
...
- 声明陈述
...
<强> 2。为什么我可以跳过变量声明然后使用它?
由于: N3337 6.7 / 3
可以转移到块,但不能绕过初始化声明。一个 跳跃的程序 (在这方面,从转换语句转移到案例标签的条件被视为跳转。)
从具有自动存储持续时间的变量不在范围内的点到其在范围内的点是不正确的 ,除非该变量具有标量类型,具有普通默认值的类类型 构造函数和一个普通的析构函数,这些类型之一的cv限定版本,或其中一个的数组 在没有初始化器(8.5)的情况下声明前面的类型。
由于k
属于标量类型,并且未在声明跳过时初始化,因此可以进行声明。这在语义上是等价的:
goto label;
int x;
label:
cout << x << endl;
但是,如果在声明点初始化x
,这将不起作用:
goto label;
int x = 58; //error, jumping over declaration with initialization
label:
cout << x << endl;