此代码编译无错误或警告:
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
编辑:标记为可能重复的其他问题线程不会回答我的问题。
如果只允许在一条语句中定义变量,则该变量将在匹配的情况下使用,并且那里的任何垃圾都会被使用;那么它与声明+初始化值有什么区别?
答案 0 :(得分:4)
案例标签用作goto
语句的目标。
C ++标准在[stmt.dcl]/3
中声明:
可以转移到块中,但不能以初始化方式绕过声明。
因此以下操作将失败:
case 'a':
int x = 4; //will fail
以下内容不会失败:
case 'a':
int x; // this is ok
x = 4;
响应OP的编辑:
在这种特殊情况下,由于声明没有括号x
,因此仅在整个switch
语句中,声明就可以使{}
可见。
因此x
也可以与其他case
一起使用,尽管编译器会警告您不要初始化它。请注意,读取uninitialized variable是未定义的行为。
回答问题的最后一部分:
假设允许使用初始化进行声明,这意味着x
的特定值(本例中为4)也必须在其他case
中使用。
然后,好像执行了多个案例的代码。所以这是不允许的。