无壳开关

问题描述 投票:0回答:3

今天,我意外地发现我的编译器在没有 case 的 switch 语句中编写代码时不会抱怨。 (它确实抱怨缺少 case 语句,但是在代码后添加了 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,我已经在几个编译器上进行了测试,它们都产生了相同的行为。令人惊讶的是,它们也都没有输出警告。)

c++ switch-statement language-design
3个回答
9
投票

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

如果你想花一些时间看看

switch
的一些奇怪的用法和案例的位置,你可以看看boost asio库中协程的实现。您可以使用宏编写一个小函数,编译并查看生成的代码(宏扩展后)是什么样子。


5
投票

来自MSDN:-

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


-3
投票

是的,如果在评估变量之前不添加 case 关键字,那么您的代码是无用的。示例:

#include <iostream>
using namespace std;
int main()
{
    int day = 2;
    switch(day)
    {
    case 1:
        cout << "Sunday";
        break;
    case 2:
        cout << "Monday";
        break;
    case 3:
        cout << "Tuesday";
        break;
    default:
        cout << "Invalid";
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.