为什么允许在switch语句中声明变量?但不是声明+初始化?

时间:2019-05-23 03:43:43

标签: c++ switch-statement

  1. 为什么不允许在switch语句的情况下声明+初始化变量并给出错误,但是如果在一行上声明它,然后在另一行上赋值,则可以编译?
  2. 即使先前的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中,该变量仍在范围内。

  

情况'a'打印4

     

案例'b'打印1

     

案例'c'打印1

编辑:标记为可能重复的其他问题线程不会回答我的问题。

  1. 为什么变量x不能定义和初始化?会导致哪些问题呢?

如果只允许在一条语句中定义变量,则该变量将在匹配的情况下使用,并且那里的任何垃圾都会被使用;那么它与声明+初始化值有什么区别?

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中使用。 然后,好像执行了多个案例的代码。所以这是不允许的。