C++ 为什么允许在switch语句中声明变量?但不是声明+;初始化? 为什么不允许在switch语句中声明+初始化变量&给出了一个错误,但是如果在一行上声明了它,然后在另一行上分配了一个值,它就会编译 为什么在前一个案例中声明的变量可以在另一个匹配案例中使用(操作),即使前一个案例语句没有执行

C++ 为什么允许在switch语句中声明变量?但不是声明+;初始化? 为什么不允许在switch语句中声明+初始化变量&给出了一个错误,但是如果在一行上声明了它,然后在另一行上分配了一个值,它就会编译 为什么在前一个案例中声明的变量可以在另一个匹配案例中使用(操作),即使前一个案例语句没有执行,c++,switch-statement,C++,Switch Statement,此代码编译时没有错误或警告: 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 bu

此代码编译时没有错误或警告:

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;
}
charch;cin>>ch;
开关(ch)
{
案例“a”:
int x;//为什么这是可以的,但不是这个(int x=4;)?
x=4;

cout案例标签作为
goto
语句的目标

C++标准中的状态:

可以传输到块中,但不能以通过初始化绕过声明的方式传输

因此,以下操作将失败:

case 'a':
    int x = 4; //will fail
鉴于以下各项不会失败:

case 'a':
    int x;  // this is ok 
    x = 4;
针对OP的编辑:

在这种特殊情况下,只有声明才能使
x
switch
语句中可见,因为它周围没有大括号
{}
。 因此,
x
也可以与其他
案例
一起使用,尽管编译器会警告未初始化使用它。请注意,读取是未定义的行为

回答问题的最后一部分:
假设允许带有初始化的声明,这意味着
x
(本例中为4)的特定值也必须用于其他
情况下的
s。

那么,这似乎是不允许的,因为这是不允许的。

为什么你把你的问题都标记为C和C++?它们是非常不同的语言,这不是编译成C,即使没有<代码> CUT
东西。第一条注释行是C中的约束违反。wed,但是在
switch
中创建的单独作用域内声明在C中是可以的。例如
switch(ch){case'a':{int x;}case'b':…}
@R..:我相信这在C中是一个语法错误。因为
int x;
是一个声明而不是一个语句,
case'a':…
不满足带标签语句的语法。(但可以通过在
案例“a”之后添加分号来合法化:
)@topcat的可能副本实际上是这样的(尽管不是第一个):初始化是在运行时还是在编译时完成的?@topcat run-time。如果您有一个具有构造函数的类(如
std::string x;
)因为构造函数将执行初始化。@topcat:根据您的编辑更新了帖子。