开关大小写语句不间断

switch-case statement without break

本文关键字:不间断 语句 大小写 开关      更新时间:2023-10-16

根据我正在阅读的这本书:

问:如果我在开关大小写语句中省略了中断,会发生什么情况?

A break 语句使程序执行能够退出开关构造。如果没有它,执行将继续计算以下 case 语句。

假设如果我的代码看起来像

switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    default:
    do C;
    break;
}

这是否意味着如果我选择案例 1,A 和 C 就完成了。如果我选择案例 2,B 和 C 就完成了。如果我两者都不选择,那么只有 C 完成。

如果是这样,如果我们在执行 C 之后省略中断会发生什么。

我认为这些都是糟糕的编程实践,但我很好奇会发生什么才能更深入地了解它是如何工作的。谢谢

从所选大小写开始执行所有内容,直到看到breakswitch 语句结束。所以可能只执行 C,或者 B 然后执行 C,或者 A 和 B 和 C,但永远不会执行 A 和 C

  • 如果您在任何情况下都不包含中断,则将执行以下所有情况,直到看到中断为止。

  • 如果您不包含默认值中断,则不会造成任何影响,因为在此"默认"情况下方没有任何情况。

  • 不使用休息通常被认为是一种不好的做法,但有时它也可能会派上用场,因为它的失败性质。例如:

    案例选项A:

    //optionA needs to do its own thing, and also B's thing.
    //Fall-through to optionB afterwards.
    //Its behaviour is a superset of B's.
    

    案例选项B:

    // optionB needs to do its own thing
    // Its behaviour is a subset of A's.
    break;
    

    案例选项C:

    // optionC is quite independent so it does its own thing.
    break;
    

break就像一个goto命令。或者,作为一个更好的例子,就像在void函数中使用return一样。既然在最后,那么它是否存在都没有区别。虽然,我确实喜欢包括它。

switch (option}{
    case 1:
    do A;
    case 2:
    do B;
    case 2:
    do C;
    break;  
    default:
    do C;
}

如果您的选择是1它会执行所有内容,直到找到break关键字...这意味着打破结束switch的执行--> case输出:A 然后 B 然后 C所以建议在每种情况下休息一下喜欢:

switch (option}{
        case 1:
        do A;
        break;
        case 2:
        do B;
        break;
        do C;
        break;        
        default:
        do D;
    }

如果您的选项是1则输出将是:只是A ...

注意:default不需要break;

我在许多评论和答案中看到,省略break行是一种不好的做法。我个人认为它在某些情况下非常有用。

让我们举一个非常简单的例子。这可能不是最好的,就把它当作一个例子:
- 登录错误时,您需要记录失败的尝试。
- 对于第三次错误的尝试,您想记录并做一些进一步的事情(警报管理员,阻止帐户,...

由于第一次和第二次尝试的操作相同,因此无需在这两者之间break并再次重写相同的命令。
现在第三次,你想做其他事情并记录。只需先执行其他操作,然后通过第一次和第二次尝试的日志操作让它运行(无break(:

switch (badCount) {
    case 3: //only for 3
        alertAdmin();
        blockAccount();
    case 2: //for 2 AND 3
    case 1: //for 1 AND 2 and 3
        errorLog();
        badCount++;
}

恕我直言,如果为不同情况使用通用代码是如此糟糕的做法,那么 C 结构根本不允许它。

关键是执行控制权被转移到匹配案例的语句中。例如

1. switch(x) {
2.   case 1:
3.      do_step1;
4.   case 2:
5.      do_step2;
6.   default:
7.      do_default;
8.   }

将第 2、4、6 行视为 goto 调用的"标签"。在 x = 1 时,控制将转移到第 3 行,第 3、5 和 7 行的执行将发生。

尝试自己 - 使用此处提供的 ideone 运行代码。

#include <stdio.h>
void doA(int *i){
    printf("doA i = %dn", *i);
    *i = 3;
}
void doB(int *i){
    printf("doB i = %dn", *i);
    *i = 4;
}
void doC(int *i){
    printf("doC i = %dn", *i);
    *i = 5;
}
int main(void) {
    int i = 1;
    switch(i){
        case 1:
            doA(&i);
        case 2:
            doB(&i);
        default:
            doC(&i);
            break;
    }
    return 0;
}

输出:

doA i = 1
doB i = 3
doC i = 4

注意:

  • 它将执行所选案例中的所有选项,直到看到breakswitch语句结束。所以可能只执行 C,或者 B 然后执行 C,或者 A 和 B 和 C,但永远不会执行 A 和 C
  • 如果更改句柄函数内开关中分析的变量的值(例如doA(,则不会影响如上所述的流量

如果没有中断语句,每次交换机中发生匹配时,该情况和后续情况的语句都会执行,直到遇到中断语句或交换机结束。