6

在 switch-case 语句中,声明与初始化是无效的,但允许声明然后赋值。如以下代码片段所示。

从编译器端看,这两种类型的初始化有什么区别?以及为什么第一种类型的初始化无效而第二种类型的初始化有效。

switch(val)  
{  
case 0:  
  int newVal = 42;  //Invalid
  break;
case 1:  
  int newVal2;      //Valid
  newVal2 = 42;  
  break;
case 2:
  break;
}
4

2 回答 2

10

实际上,规则是您不能跳过具有初始化的声明(或超过非 POD 类型变量的声明)的块。C++ 标准说(C++03 §6.7):

可以转移到一个块中,但不能通过初始化绕过声明的方式。除非变量具有 POD 类型 (3.9) 并且在没有初始化程序( 8.5)。

(*) 从switch语句的条件到case标签的转移在这方面被认为是跳转。

int newVal = 42;是具有初始化程序(= 42部分)的声明。该程序格式错误,因为如果val12,您将在初始化之后跳转到 switch 块。

int newVal2;也是声明;因为int是 POD 类型并且声明没有初始化器,所以您可以跳过此声明。

于 2010-09-21T05:47:34.103 回答
5

事实上,两者都不是合法的 C++。除非有作用域,否则不能在 switch case 中声明变量:

switch(val)  
{  
case 0:  
  {
    int newVal = 42;  // now valid
  }
  break;
case 1:  
  {
    int newVal2;      // still Valid
    newVal2 = 42;  
  }
  break;
case 2:
  break;
}

您的编译器允许案例 1 的事实是您的编译器的缺陷,或者可能是扩展。至少,按照标准。

于 2010-09-21T05:09:53.060 回答