cppreference.com统计switch语句的形式为:attr switch ( condition ) statement
并且statement
为任何语句。
那么,如果我没有在statement
中放置任何case:
或default:
标签,会发生什么,如: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
标签标记,因此不会执行任何语句。
记住:标签不是语句之间的流结构:它们是语句的注释。就switch
和goto
而言,它们只是跳转的地方。仅此而已。
尽管switch
/case
示例的常见模式和排版已经在惯例和教科书中找到了位置,但语言语法中没有任何内容意味着你必须这样写。
switch
只是具有可选回退("默认"(情况的条件goto