c++:为什么在switch的情况下我们可以声明一个变量
c++: why can we declare a variable in case of switch
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
标记语句:
- 属性说明符seqopt
case
constant-expression
:statement
。。。
在 语句N3337 6/1: 语句: 。。。 2.为什么我可以跳过变量声明然后使用它 因为:N3337 6.7/3 可以转移到块中,,但不能通过初始化绕过声明。A.跳跃的程序(从切换语句的条件到事例标签的转移在这方面被视为跳跃。) 从一个具有自动存储持续时间的变量不在作用域中的点到它在作用域内的点是格式错误的,除非变量具有标量类型,类类型具有琐碎的默认值构造函数和一个平凡的析构函数,其中一个类型的cv限定版本,或者其中一个的数组前面的类型,并且在没有初始化器的情况下声明(8.5)。 由于 然而,如果C++
中,声明语句也被视为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;
相关文章:
- 在疯狂的部分中声明变量
- 如何在C++中为高分辨率时钟声明变量?
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- CUDA 的性能取决于声明变量
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- C++声明变量时自动类型推断而不初始化
- 在不同循环中多次声明变量的优点
- 奇怪的错误 C2131 与 constexpr 声明变量
- 是否可以在 "if" 语句中声明变量?
- 在python-ctypes中声明变量并传递给dll函数
- 在递归函数C++中声明变量
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 奇怪的未声明变量编译器错误
- 我在C++程序中声明变量时遇到问题
- 在命名空间中声明变量
- C++ lambda 按值捕获,而无需更早声明变量
- 声明变量以保存字符串列表时的内存分配
- 如何声明C 变量应突变
- 为什么允许在开关语句中声明变量?但不是声明 初始化
- 在同一命名空间中声明变量和函数是否出错?[C++]