为什么允许在开关语句中声明变量?但不是声明 初始化
Why is declaring a variable in switch statement allowed? but not declaration + initialization?
- 为什么在不允许&给出一个错误,但是如果将其声明在一行上,然后在另一行上分配一个值,则编译?
- 为什么在上一个案例中声明的变量可以在另一个匹配的情况下使用(操作(,即使以前的案例语句未执行!
此代码没有错误或警告:
char ch; cin>> ch;
switch(ch)
{
case 'a':
int x; // How come this is ok but not this(int x = 4;)?
x = 4;
cout<< x << endl;
break;
case 'b':
x += 1; // x is in scope but its declaration did not execute!
cout<< x << endl;
break;
case 'c':
x += 1;
cout<< x << endl;
break;
}
我希望case 'b'
或case 'c'
不知道有一个称为X的变量。我知道在b和案例c。
案例'a'打印4
案例'b'打印1
案例'c'打印1
编辑:没有标记为可能重复的另一个问题线程不会回答我的问题。
- 为什么不能定义和初始化变量X?什么问题会造成不允许这样做的问题?
如果仅在一个语句中定义变量,则该变量在匹配情况下使用,并且在其中使用了任何垃圾;那么它与声明 初始化值有什么区别?
案例标签作为goto
语句的目标。
[stmt.dcl]/3
中的C 标准状态:
可以转移到一个块中,但不能以初始化声明的方式。
。
,以下将失败:
case 'a':
int x = 4; //will fail
,而以下内容不会失败:
case 'a':
int x; // this is ok
x = 4;
响应OP的编辑:
在这种特殊情况下,声明使x
在整个switch
语句中可见,因为周围没有括号{}
。因此,x
也可以与其他case
S一起使用,尽管编译器会警告使用它非初始化。请注意,读取非初始化变量是不确定的行为。
回答您问题的最后一部分:
假设允许使用初始化的声明,这意味着x
的特定值(在这种情况下为4(也必须在其他case
s中使用。那么似乎执行了多种情况的代码。因此不允许。
相关文章:
- 在疯狂的部分中声明变量
- 如何在C++中为高分辨率时钟声明变量?
- 在命名空间中声明变量,在 main 中定义它,使其对所有其他文件可见
- CUDA 的性能取决于声明变量
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- C++声明变量时自动类型推断而不初始化
- 在不同循环中多次声明变量的优点
- 奇怪的错误 C2131 与 constexpr 声明变量
- 是否可以在 "if" 语句中声明变量?
- 在python-ctypes中声明变量并传递给dll函数
- 在递归函数C++中声明变量
- 只有一个定义/声明时标头声明变量的多堆定义错误
- 奇怪的未声明变量编译器错误
- 我在C++程序中声明变量时遇到问题
- 在命名空间中声明变量
- C++ lambda 按值捕获,而无需更早声明变量
- 声明变量以保存字符串列表时的内存分配
- 如何声明C 变量应突变
- 为什么允许在开关语句中声明变量?但不是声明 初始化
- 在同一命名空间中声明变量和函数是否出错?[C++]