今天,我意外地发现我的编译器在没有 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,我已经在几个编译器上进行了测试,它们都产生了相同的行为。令人惊讶的是,它们也都没有输出警告。)
是的,行为是按照语言设计的,您可以在不同的地方添加代码。 Switch 语句比外观复杂得多,并且它们允许相当深奥的代码,无论有意义与否。
如果你想花一些时间看看
switch
的一些奇怪的用法和案例的位置,你可以看看boost asio库中协程的实现。您可以使用宏编写一个小函数,编译并查看生成的代码(宏扩展后)是什么样子。
来自MSDN:-
声明可以出现在构成复合语句的头部 开关主体,但声明中包含的初始化是 不执行。 switch 语句将控制直接转移到 正文中的可执行语句,绕过包含的行 初始化。
是的,如果在评估变量之前不添加 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;
}