【发布时间】:2019-05-23 03:43:43
【问题描述】:
- 为什么不允许在 switch 语句的情况下声明 + 初始化变量并给出错误,但如果在一行上声明它然后在另一行上赋值,它会编译?
- 为什么即使前面的 case 语句没有执行,也可以在另一个匹配的 case 中使用(操作)在前面的 case 中声明的变量!
此代码编译时没有错误或警告:
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 中该变量仍在范围内。
case 'a' 打印 4
case 'b' 打印 1
case 'c' 打印 1
编辑:没有其他标记为可能重复的问题线程不能回答我的问题。
- 为什么不能定义和初始化变量x?不允许这样做会造成什么问题?
如果只允许在一个语句中定义变量,那么在匹配的情况下使用该变量,并且使用其中的任何垃圾;那么和声明+初始化值有什么区别呢?
【问题讨论】:
-
您为什么将您的问题同时标记为 C 和 C++?它们是非常不同的语言,即使没有
cout的东西,它也不能编译为 C。注释的第一行是 C 中的约束违规。 -
不允许单独在
switch中声明,但在switch中创建的单独范围内声明在 C 中是可以的。switch(ch) { case 'a': { int x; .. } case 'b' : ... } -
@R..:我认为这是 C 语言中的语法错误。由于
int x;是声明而不是语句,case 'a': ...不满足标记语句的语法。 (但可以通过在case 'a':之后添加分号来使其合法。) -
@topcat 实际上是这样(虽然不是第一个):stackoverflow.com/a/19830820/1753435
标签: c++ switch-statement