c++:为什么在switch的情况下我们可以声明一个变量

c++: why can we declare a variable in case of switch

本文关键字:声明 变量 一个 为什么 switch 我们 情况下 c++      更新时间:2023-10-16
int i;
i = 2;
switch(i)
{
case 1: 
int k;
break;
case 2:
k = 1;
cout<<k<<endl;
break;
}

我不知道为什么上面的代码有效

在这里,我们永远无法进入情况1,但为什么我们可以在情况2中使用k

实际上有两个问题:

1.为什么我可以在case标签后声明一个变量

这是因为在C++中,标签必须以的形式出现

N3337 6.1/1

标记语句:

  • 属性说明符seqoptcaseconstant-expression:statement

。。。

C++中,声明语句也被视为

语句N3337 6/1:

语句:

  • 声明语句

。。。

2.为什么我可以跳过变量声明然后使用它

因为:N3337 6.7/3

可以转移到块中,,但不能通过初始化绕过声明。A.跳跃的程序(从切换语句的条件到事例标签的转移在这方面被视为跳跃。)

从一个具有自动存储持续时间的变量不在作用域中的点到它在作用域内的点是格式错误的,除非变量具有标量类型,类类型具有琐碎的默认值构造函数和一个平凡的析构函数,其中一个类型的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;