不带大小写或缺省值的switch语句:标签

问题描述

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


如问题中所述,如果要声明变量,则需要在switch语句 中添加范围。但是,这不会影响上述几点。以下代码段:

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

也不执行cout语句。

,

什么都没发生。

[stmt.switch/5]: 执行switch语句时,将评估其条件。如果大小写常量之一与条件值相同,则将控制传递给匹配的案例标签后面的语句。如果没有大小写常量与条件匹配,并且没有默认标签,则控制传递到由default标签标记的语句。 如果没有大小写匹配,并且没有default,则开关中的所有语句都不会执行。

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

请记住:标签不是在语句之​​间使用的流程构造:它们是 for 语句的注释。对于switchgoto,它们只是跳转的地方。就是这样。

尽管switch / case示例的常见模式和排版在约定俗成和教科书中都可以找到,但是语言语法中没有任何内容意味着您必须这样写。

switch只是有条件的goto,带有可选的后备(“默认”)大小写。