18

今天,我无意中发现,在没有大小写的 switch 语句中编写代码时,我的编译器不会报错。(它确实抱怨缺少 case 语句,但是在代码后面添加一个之后,并没有警告让我知道代码没用。)

我试图弄清楚是否有允许以下代码的目的,或者它是否只是“限制它的工作量更大,所以它是允许的”的事情之一。

#include <iostream>
void foo() {
   std::cout << "foo" << std::endl;
}

int main()
{
   for (int a = -10; a < 10; ++a)
   {
      switch(a)
      {
         foo();
      case 4:
         std::cout << "4" << std::endl;
      }
   }
}

现在,当 a == 4 时,它会按预期输出“4”,并且它永远不会输出 foo。所以问题是,是否有一些(可能深奥但有用的)理由允许foo();在第一个案例之前声明?我确定我不允许在那里声明和初始化变量。

(FWIW,我已经在几个编译器上对此进行了测试,它们都产生了相同的行为。令人惊讶的是,它们也都没有输出警告。)

4

2 回答 2

8

是的,行为是语言中设计的,您可以在不同的地方添加代码。Switch 语句比外观复杂得多,并且它们允许非常深奥的代码,无论它是否有意义。

如果你想花点时间看看switchcase的一些奇怪的用法和位置,你可以看看boost asio库中协程的实现。您可以使用宏编写一个小函数,编译并查看生成的代码(宏扩展后)的样子。

于 2013-08-08T18:50:36.027 回答
3

MSDN:-

声明可以出现在构成 switch 主体的复合语句的开头,但不执行包含在声明中的初始化。switch 语句将控制直接转移到主体内的可执行语句,绕过包含初始化的行。

于 2013-08-08T18:51:45.297 回答