- 为什么在switch语句的一个case中声明+初始化变量是不允许的并会出现错误,但如果在一行上声明它然后在另一行上分配一个值,则可以编译通过?
- 为什么在先前的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 的变量。但是我知道变量 x 在 case b 和 case c 中仍然在作用域内。
case 'a' 输出 4
case 'b' 输出 1
case 'c' 输出 1
编辑:不,被标记为可能重复的其他问题线程没有回答我的问题。
- 为什么变量 x 不能定义和初始化?如果允许这样做会产生什么问题,导致不被允许这样做?
如果只允许在一个语句中定义变量,那么变量将在匹配的 case 中使用,同时会使用其中的任何垃圾值;与声明+初始化变量有什么区别呢?
cout
的内容,也不能编译成C。第一行被注释的代码在C中违反了约束条件。 - R.. GitHub STOP HELPING ICEswitch
中声明是不允许的,但是在switch
中创建的不同作用域中声明是可以的。例如:switch(ch) { case 'a': { int x; .. } case 'b' : ... }
- David C. Rankinint x;
是一个声明,x在switch语句中变得可见。另一方面,对x进行操作取决于选择哪条路径。因此,将声明和初始化结合在一起可能会产生误导。如果只有在选择了某个路径时才进行初始化,那么不允许这样做是有道理的。 - doug