代码之家  ›  专栏  ›  技术社区  ›  Jeremy Cron

C开关变量初始化:为什么此代码不会导致编译器错误或运行时错误?

  •  8
  • Jeremy Cron  · 技术社区  · 15 年前
    ...
    case 1:
       string x = "SomeString";
       ...
       break;
    case 2:
       x = "SomeOtherString";
       ...
       break;
    ...
    


    对于C中的switch语句,有什么我不理解的地方吗?当使用案例2时,为什么这不是一个错误?
    编辑:此代码有效,不会引发错误。

    6 回复  |  直到 15 年前
        1
  •  16
  •   Noldorin    15 年前

    你必须小心你怎么想 switch 在这里陈述。有 不创建变量范围 事实上,一切都在继续。不要因为案例中的代码被缩进而让它驻留在子范围内。

    当一个交换块被编译时, case 标签被简单地转换成标签,并且 goto 根据开关表达式,指令在switch语句的开头执行。实际上,您可以手动使用 古托 创建“失败”情况的语句(C直接支持),如 the MSDN page 建议。

    goto case 1;
    

    如果您特别想在 转换 Block,您可以执行以下操作。

    ...
    case 1:
    {
       string x = "SomeString";
       ...
       break;
    }
    case 2:
    {
       string x = "SomeOtherString";
       ...
       break;
    }
    ...
    

    这个 要求 重新声明变量 x (否则将收到编译器错误)。在某些情况下,对每个(或至少一些)进行范围界定的方法可能非常有用,而且您一定会不时在代码中看到它。

        2
  •  8
  •   Community Egal    7 年前

    有关的文档 MSDN 说:

    switch语句的switch块(第8.7.2节)中声明的局部变量的范围是switch块。

    此外,之前也提出过类似的问题: Variable declaration in c# switch statement

        3
  •  4
  •   Reed Copsey    15 年前

    没有编译器错误,因为switch语句没有为变量创建新的作用域。

    如果在开关内部声明变量,则该变量与开关周围的代码块在同一范围内。要更改此行为,您需要添加:

    ...
    case 1:
        // Start a new variable scope 
        {
            string x = "SomeString";
            ...
        }
        break;
    case 2:
        {
            x = "SomeOtherString";
            ...
        }
        break;
    ...
    

    这将导致编译器抱怨。但是,开关本身并不会在内部执行此操作,因此代码中没有错误。

        4
  •  1
  •   D'Arcy Rittich    15 年前

    看起来变量的作用域在开关中,而不是在案例中,这可能是因为案例可以被叠加。请注意,如果您试图在开关外部引用x,它将失败。

        5
  •  0
  •   Syed Tayyab Ali    15 年前

    如果在case内创建任何局部变量,则不能在case外使用它们。

    ...
    int opt ;
    switch(opt)
    {
    case 1:
    {
       string x = "SomeString";
       ...
    }
       break;
    case 2:
    {
       string x = "SomeOtherString";
       ...
    }
       break;
    default:
    {
    //your code
    }
    break;
    }
    ...
    
        6
  •  -2
  •   Pat    15 年前

    将字符串声明移到

    switch(value)
    

    语句。然后为每种情况指定X。