【问题标题】:A switch statement without case: or default: labels没有 case: 或 default: 标签的 switch 语句
【发布时间】:2020-09-18 16:00:20
【问题描述】:

cppreference.com stats,switch语句的格式为:
attr switch ( condition ) statement
并且 statement任何声明。

那么,如果我没有在statement 中添加任何case:default: 标签会发生什么情况:
switch (1) {std::cout << 'x';}

如果我用额外的大括号将一个不在任何case:default: 标签之后的语句包装成:
switch (1) {{std::cout << 'x';}}
因为用额外的大括号包装变量声明将使该声明合法,即使它在每个 case:default: 标签之前也是如此。

【问题讨论】:

  • 你在这里问了两个不相关的问题。请将帖子缩小到一个问题。

标签: c++ switch-statement control-flow


【解决方案1】:

是的,语法允许switch 语句中的任何语句。所以下面的sn-p:

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

虽然没用,但完全有效,因为 switch 中没有以 casedefault 标签开头的语句将永远不会被执行。


如问题中所述,如果要声明变量,则需要在switch 语句中添加范围。但是,这并不影响上述观点。以下sn-p:

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

也不执行cout 语句。

【讨论】:

  • 谢谢,我编辑了我的问题。你能回答我添加的附加部分吗?
  • @cigien:有一个例外:循环可以循环回到第一种情况之前的代码中。又名Duff's Device,在某些情况下可以在微优化中创造奇迹。
  • @MooingDuck 不,AFAIK 无法控制转到switch 中的案例标签之前的语句。 Duff 的设备也不这样做。
  • @cigien coliru.stacked-crooked.com/a/39f7e7ee47388cf6。 Duff 的设备确实循环到第一种情况之前。只是 Duff 的设备的正常形式没有将代码放在那里。
  • @cigien:我的见解是:switch 只是 goto 的漂亮打印。我应该看看这是否适用于 Java
【解决方案2】:

什么都没有发生。

[stmt.switch/5]: switch 语句被执行时,它的条件被求值。 如果一个case 常量的值与条件相同,控制被传递给匹配的语句之后的语句案例标签。如果没有大小写常量与条件匹配,并且如果存在默认标签,则控制传递到由default 标签标记的语句。 如果没有大小写匹配且没有default,则不会执行 switch 中的任何语句。

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

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

虽然switch/case 示例的常见模式和排版已在惯例和教科书中找到位置,但语言语法中没有任何内容意味着您必须以这种方式编写它们.

switch 只是一个有条件的goto,带有一个可选的后备(“默认”)案例。

【讨论】:

    猜你喜欢
    • 2019-09-11
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-13
    相关资源
    最近更新 更多