【问题标题】:standalone break within a switch statementswitch 语句中的独立中断
【发布时间】:2016-04-27 08:17:43
【问题描述】:

我偶然发现了这段代码,它按预期工作:

switch (ev->deviceType) {

    break;

    case DEVICE_TS1E0:
        //some code
        break;

    case DEVICE_TS1E3:
       //some code
       break;

    default:
        //some logging
        break;
}

现在,切换开始时有一个孤独的break;,似乎没有任何效果。

在任何情况下break; 会产生影响吗?

【问题讨论】:

  • 对我来说,这看起来像是剩下的糟糕的代码清理......
  • @JoachimPileborg 这不会做任何意想不到的事情。即使switch 处于循环中,流浪的break 也是NOP。

标签: c switch-statement break


【解决方案1】:

TL;DR break 语句无效并且是死代码。控制永远不会到达那里。

C11 标准有一个很好的类似案例的例子,让我直接引用。

来自第 §6.8.4.2/7 章,(强调我的

EXAMPLE 在仿真程序片段中

switch (expr)
{
    int i = 4;
    f(i);
case 0:
    i = 17;
    /* falls through into default code */
default:
    printf("%d\n", i);
}

标识符为i的对象存在自动存储持续时间(在块内)但永远不会 已初始化,,因此如果控制表达式具有非零值,则对 printf 函数的调用将 访问一个不确定的值。同样,无法调用函数f

【讨论】:

  • 我真的想知道为什么标准在第一种情况之前允许除了变量声明之外的任何其他内容。
  • @MichaelWalz 和if (foo) { return; } else { return; } return;的情况一样,有死码,但必须是有效码。
  • @fluter 当然,但标准可能会禁止此类构造,因为除了第一个 case 之前的声明之外的 任何 语句都将无效。
【解决方案2】:

该语句以及不在switch 语句中的case 子句中的任何其他语句都是无法访问的代码,也就是死代码。这意味着它们无论如何都不会运行。不建议使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    相关资源
    最近更新 更多