C ++ 11:在switch语句中声明变量

时间:2014-04-29 17:58:24

标签: c++ variables c++11 switch-statement definition

我知道C ++ 03不允许在不使用的情况下在switch块中定义变量 花括号。

const int i = ...
switch (i) { case 0: int j = 0; break; } // 1. error here
switch (i) { case 0: { int j = 0; } break; } // 2. ok

有关新C ++ 11标准的内容是什么? 它是否允许第一种形式? 我还能写这样的东西:

switch (i) 
{ 
  case 0: int j = 0; break; 
  case 1: int j = 0; break; 
  case 2: int j = 0; break; 
} 

3 个答案:

答案 0 :(得分:4)

case语句没有(在C ++ 03中),但仍然没有(在C ++ 11中)引入范围。

标准在[stmt.switch](6.4.2 / 6)中说:

  案例和默认标签本身不会改变流量   控制,在这些标签上继续畅通无阻。

因此,允许“落实”这样的case语句:

int x, a = 1;
switch(a) {
case 1:
    x = 5;
    // no break here!
case 10:
    x *= 4; // x is now 20.
}

如果你要在第一个case语句下面引入一个变量声明,当跳转到第二个case语句时,可以跳过它。

但是,您可以在switch块的开头声明一个局部变量:

switch (i) 
{
    int j;
case 0: j = 0; break; 
case 1: j = 0; break; 
case 2: j = 0; break; 
}

switch实际上是一个跳转表,而不是一系列if / else if语句。

答案 1 :(得分:1)

C ++ 03当然允许您在switch语句的主体内定义变量。该主体与任何其他复合语句完全不同,跳转到标签的规则应用相同的方式:您只能跳到

的范围内
  • 没有初始化程序声明的标量类型
  • 使用简单的默认构造函数和没有初始化程序声明的普通析构函数的类类型
  • 以上
  • 的数组

这些规则在C ++ 11中没有改变。

#include <iostream>
int main()
{
    int n;
    std::cin >> n;

    switch(n)
    {
               int a;      // okay, scalar with no initializer
       case 1: int b = 10; // okay, no more labels, no way jump into scope
               a = b = 3*n;
               break;
    }

答案 2 :(得分:0)

由于范围问题,您无法写入此内容。您的代码将导致重新定义变量j

在您的代码中:

const int i = ...
switch (i) { case 0: int j = 0; break; } // the error should be linked to default statement that is not there
switch (i) { case 0: { int j = 0; } break; } // here  you define a local scope in which you can define `j` ; j will be destroyed after the closing bracket.

即使在c ++ 11中,尝试这样做:

switch (i) 
{ 
  case 0: int j = 0; break; 
  case 1: int j = 0; break; 
  case 2: int j = 0; break; 
} 

导致的错误与您要写的错误相同:

for ( ; ; ) {
      int i = 0 ;
      int i = 0 ;
      int i = 0 ;
}

这将导致重新定义错误