我知道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;
}
答案 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 ;
}
这将导致重新定义错误