问题描述
cppreference.com stats,switch语句的形式为:attr switch ( condition ) statement
并且statement
是任何语句。
因此,如果我没有在case:
中放置任何default:
或statement
标签,将会发生什么,如下所示:switch (1) {std::cout << 'x';}
如果我包装没有在任何case:
或default:
标签之后出现的语句,并且带有大括号,该怎么办:switch (1) {{std::cout << 'x';}}
因为用另外的花括号包裹变量的声明会使该声明合法,即使它在每个case:
和default:
标签之前。
解决方法
是的,语法允许在switch
语句中使用任何语句。因此,以下代码段:
switch( /* condition */ )
{
std::cout << "hello";
}
完全有效,尽管没有用,因为switch
内没有case
或default
标签的语句将永远不会执行。
如问题中所述,如果要声明变量,则需要在switch
语句 中添加范围。但是,这不会影响上述几点。以下代码段:
switch( /* condition */ )
{
{
std::cout << "hello";
}
}
也不执行cout
语句。
什么都没发生。
[stmt.switch/5]:
执行switch
语句时,将评估其条件。如果大小写常量之一与条件值相同,则将控制传递给匹配的案例标签后面的语句。如果没有大小写常量与条件匹配,并且没有默认标签,则控制传递到由default
标签标记的语句。 如果没有大小写匹配,并且没有default
,则开关中的所有语句都不会执行。
您没有使用case
标签标记任何语句,因此没有一个与条件匹配的case
标签标记,因此不会执行任何语句。
请记住:标签不是在语句之间使用的流程构造:它们是 for 语句的注释。对于switch
和goto
,它们只是跳转的地方。就是这样。
尽管switch
/ case
示例的常见模式和排版在约定俗成和教科书中都可以找到,但是语言语法中没有任何内容意味着您必须这样写。
switch
只是有条件的goto
,带有可选的后备(“默认”)大小写。