switch-case语句没有中断

时间:2015-10-19 19:34:02

标签: c++ switch-statement

根据这本书,我正在读:

问如果我在switch-case语句中省略了一个中断会怎样?

a break语句使程序执行能够退出switch构造。 如果没有它,执行将继续评估以下案例陈述。

假设我的代码看起来像

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

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

如果是这样的话,如果我们在做了C.之后省略了休息,会发生什么。

我认为这些是糟糕的编程习惯,但我很好奇将会更深入地了解它是如何工作的。感谢

7 个答案:

答案 0 :(得分:17)

从所选案例开始执行所有操作,直到您看到breakswitch语句结束。所以可能只有C被执行,或者B然后是C,或者A和B和C,但是从来没有A和C

答案 1 :(得分:9)

  • 如果你没有在任何案件中包含休息,那么下面的所有案例都将被执行,直到它看到休息。

  • 如果你没有在默认情况下包含break,那么它将不起作用,因为在这个'Default'情况下没有任何情况。

  • 并且不使用休息通常被认为是一种不好的做法,但有一段时间它也可能因为它的落后性质而变得方便。例如:

    案例选项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;
    

答案 2 :(得分:7)

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;

答案 3 :(得分:3)

我在许多评论和答案中都看到,省略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++;
}
Imho,如果为不同的案例设置公共代码是不好的做法,那么C结构就不会允许它。

答案 4 :(得分:2)

休息就像一个" GOTO"命令,或者,可能是一个更好的例子,就像使用" return"在" void"功能。因此,既然结束了,它是否存在没有区别。虽然我想包括它。

答案 5 :(得分:1)

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

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行。

答案 6 :(得分:0)

尝试一下-使用here上的 ideone 运行代码。

#include <stdio.h>

void doA(int *i){
    printf("doA i = %d\n", *i);
    *i = 3;
}

void doB(int *i){
    printf("doB i = %d\n", *i);
    *i = 4;
}

void doC(int *i){
    printf("doC i = %d\n", *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
  • 如果您更改了句柄函数内部在switch中分析的变量的值(例如doA),则不会影响上述流程