不带大小写:或默认值:标签的switch语句



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内部没有casedefault标签的语句永远不会被执行。


如问题中所述,如果要声明变量,则需要在switch语句中添加作用域。然而,这并不影响上述观点。以下片段:

switch( /* condition */ ) 
{
{
std::cout << "hello";
}
}

也不执行cout语句。

什么都没发生。

[stmt.switch/5]:执行switch语句时,将评估其条件如果其中一个大小写常量的值与条件相同,则控制权将传递给匹配大小写标签后面的语句。如果没有大小写常量与条件匹配,并且存在默认标签,则控制权将传递给由default标签标记的语句如果没有匹配的大小写,并且没有default,则交换机中的任何语句都不会执行

您没有用case标签标记任何语句,因此它们都没有用与条件匹配的case标签标记,因此不会执行任何语句。

记住:标签不是语句之间的流结构:它们是语句的注释。就switchgoto而言,它们只是跳转的地方。仅此而已。

尽管switch/case示例的常见模式和排版已经在惯例和教科书中找到了位置,但语言语法中没有任何内容意味着你必须这样写。

switch只是具有可选回退("默认"(情况的条件goto

相关内容

  • 没有找到相关文章

最新更新