【问题标题】:Last break in switch unnecessary?最后一个开关没必要?
【发布时间】:2021-04-02 08:21:41
【问题描述】:

我正在思考我为 4 个互斥情况编写的 switch 语句。我在每个案例的末尾插入了一个 break 语句,因为我不想在一个案例或另一个案例成功后再次进行测试。

这是一个问题。如果有的话,最后一次休息会做什么?如果测试用例 43 成功,则 break 终止 case,但如果没有 break,则默认不应运行,因此无论如何都不会浪费测试。

代码如下:

switch(telemetry) {
    case(40):
        printf("\nHouse Telemetry #%i \n", psc);
        break;
    case(41):
        printf("\nNav Telemetry #%i \n", psc);
        break;
    case(42):
        printf("\nDownhill Telemetry #%i \n", psc);
        break;
    case(43):
        printf("\nRealTime Telemetry #%i \n", psc);
        break; // what do I do?
    default:
        printf("\nCommand ID not recognized\n");
}

也许你们中的一位编译器大师可以给我建议。

【问题讨论】:

  • 如果后面没有语句,默认不需要break语句。
  • break 不是关于你是否重做 测试(它永远不会重做),而是关于你是否陷入下一个案例。
  • 始终添加break 是一个好习惯。查找缺少中断的运行时错误是一件痛苦的事(祖父建议)

标签: c switch-statement default


【解决方案1】:

如果您在案例 43 中没有 break;,它将落入默认案例,并且执行 printf("\nCommand ID not recognized\n");

为什么你认为default 不会运行? switch-case 将继续执行,直到遇到break 语句,这包括default 部分。

因此 需要中断以实现所需的行为。


在 switch-case 的最后一个元素(无论是 default 还是 case)上放置 break; 是可选的,因为它会停止即将结束的执行。

我遇到过对此有两种看法的程序员:不应该在代码块的最后加上一个额外的break,因为它没有必要,或者为了保持一致性,应该有一个break。未来可能会重新安排这些部分。

【讨论】:

  • 感谢所有的受访者。显然,多年来我一直对 switch 语句的内部运作持有错误的想法。现已更正。
【解决方案2】:

每个 case 中的 break 关键字表示特定 case 的结束。如果我们不在每个 case 中都设置 break,那么即使执行了特定的 case,C 中的 switch 也会继续执行所有 case,直到结束。这不应该发生;因此,我们总是必须在每种情况下放置 break 关键字。 Break一旦执行就会终止case,控件会掉出switch。

【讨论】:

    【解决方案3】:

    switch 语句不是将代码分成不同情况的语言结构。它是一个计算的“go to”语句:基于 switch 表达式,它使程序控制跳转到其中一个标签。

    一旦跳转完成,switch 不会对执行进行任何进一步的控制。它不会将案例彼此分开,也不会在每个案例的末尾插入跳转或返回。因此,如果您希望控制留下一种情况的代码,而不是另一种情况的代码,则必须插入break或其他影响程序控制的指令(如return)。

    switch 语句的这一特性使得以下用途成为可能:

    switch (letter)
    {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
            printf("Vowel.\n");
            break;
        default:
            printf("Consonant.\n");
            break;
    }
    

    使用一段代码观察有五个case 标签。如果switch 自动将它们分开,则前四个将为空;当letteraeio 时,他们什么都不会做。

    另一个例子是一个案例做了一些准备工作,然后落入另一个案例,例如:

    switch (operation)
    {
        case Subtract:
            b = -b;
        case Add:
            result = a+b;
            break;
        case Multiply:
            result = a*b;
            break;
    }
    

    这里Add 案例添加了两个数字,Subtract 案例通过否定b 然后继续Add 案例的代码来工作。如果switch 自动分隔大小写,这将不起作用。 (当然,这是一个简化的例子。)

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 2021-04-12
      • 2021-12-18
      • 2021-11-17
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多