没有 case: 或 default: 标签的 switch 语句

A switch statement without case: or default: labels

cppreference.com stats 即switch语句的形式为:
attr switch ( condition ) statement
statementany 语句。

那么,如果我没有在 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]: When the switch statement is executed, its condition is evaluated. If one of the case constants has the same value as the condition, control is passed to the statement following the matched case label. If no case constant matches the condition, and if there is a default label, control passes to the statement labeled by the default label. If no case matches and if there is no default then none of the statements in the switch is executed.

您没有使用 case 标签标记您的任何语句,因此其中 none 被匹配条件的 case 标签标记,因此没有语句是已执行。

记住:标签不是语句之间的流构造:它们是注释 for 语句。在 switchgoto 的情况下,它们只是跳转到的地方。就是这样。

虽然 switch/case 示例的通用模式和排版已在惯例和教科书中找到位置,但语言语法中没有任何内容表明您 那样写。

switch 只是一个条件 goto 和一个可选的回退(“默认”)案例。