我在玩代码时遇到了一个有趣的特点。我正在使用Eclipse CDT 4.5.2与Cygwin和C ++ 14打开(-std = c ++ 14)。 CASE中的变量初始化通常是禁止的,但以下代码编译:
switch( int switchStatement = 11)
{
default:
++j;
break; // break is optional, still compiles even if omitted
case 11:
int caseVariable = 0;
++j;
}
如果添加了另一个CASE,则会引发异常“跳转到案例标签”。
switch( int switchStatement = 11)
{
default:
++j;
case 11:
int caseVariable = 0;
++j;
case 12: // exception
++j;
}
有人可以解释一下这一切是如何运作的吗?
答案 0 :(得分:1)
为什么在第二种情况下遇到错误但在最后一个case语句中声明变量时没有收到错误?
因为跳转不能通过变量传递C ++规则 声明在同一范围内。所以当你跳到案例2时,你会过去 情况1中的变量声明。但是变量声明在 最后一种情况是可以的,因为它永远不会被跳过。
规则的原因是,如果您允许跳过变量 声明编译器是否很难确定是否 为该变量调用析构函数。如果你跳过了 变量声明你不需要调用析构函数,如果你 你没想跳过。
在一个case语句中声明和初始化的变量仍然可以在其他case块中看到但是它们不会被初始化,因为初始化代码属于另一个case。
在C ++中问题是范围的。这里,case语句是“标签”。因此,编译器会将它们从一个语句跳转到另一个语句。在此特定示例中,编译器将不了解如何继续进行。要解决此问题,您可以将案例中的代码包含在{}块中。额外的{和}意味着编译器在调用析构函数时没有问题。因此,在声明新变量时为该特定case语句提供范围或大括号非常重要。