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

Why is declaring a variable in switch statement allowed? but not declaration + initialization?

本文关键字:声明 变量 初始化 开关 语句 为什么      更新时间:2023-10-16
  1. 为什么在不允许&给出一个错误,但是如果将其声明在一行上,然后在另一行上分配一个值,则编译?
  2. 为什么在上一个案例中声明的变量可以在另一个匹配的情况下使用(操作(,即使以前的案例语句未执行!

此代码没有错误或警告:

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?什么问题会造成不允许这样做的问题?

如果仅在一个语句中定义变量,则该变量在匹配情况下使用,并且在其中使用了任何垃圾;那么它与声明 初始化值有什么区别?

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

[stmt.dcl]/3 中的C 标准状态:

可以转移到一个块中,但不能以初始化声明的方式

,以下将失败:

case 'a':
    int x = 4; //will fail

,而以下内容不会失败:

case 'a':
    int x;  // this is ok 
    x = 4;

响应OP的编辑:

在这种特殊情况下,声明使x在整个switch语句中可见,因为周围没有括号{}。因此,x也可以与其他case S一起使用,尽管编译器会警告使用它非初始化。请注意,读取非初始化变量是不确定的行为。

回答您问题的最后一部分:
假设允许使用初始化的声明,这意味着x的特定值(在这种情况下为4(也必须在其他case s中使用。那么似乎执行了多种情况的代码。因此不允许。