不间断的 switch-case 语句
switch-case statement without break
我正在看的这本书是:
问如果我在 switch-case 语句中省略 break 会怎样?
A break 语句使程序执行能够退出 switch 构造。
没有它,执行将继续评估以下 case 语句。
假设我的代码看起来像
switch (option}{
case 1:
do A;
case 2:
do B;
default:
do C;
break;
}
这是否意味着如果我选择案例1,A和C就完成了。如果我选择案例 2,B 和 C 就完成了。如果两者都不选,则只完成C
如果是这样,如果我们在执行 C 之后省略 break 会发生什么。
我认为这些都是糟糕的编程习惯,但我很好奇会发生什么来更深入地了解它是如何工作的。谢谢
您执行从所选案例开始的所有操作,直到您看到 break
或 switch
语句结束。所以可能只有 C 被执行,或者 B 然后 C,或者 A 和 B 和 C,但从不执行 A 和 C
如果您在任何情况下都不包含 break,那么下面的所有 case 都将被执行,直到它看到 break。
如果您不在默认情况下包含 break,那么它将不会产生任何效果,因为在这个 'Default' 案例之下没有任何案例。
不使用 break 通常被认为是一种不好的做法,但有时它也可能派上用场,因为它会失败 nature.For 示例:
案例选项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
关键字...
这意味着 break 结束 switch
的执行 --> case
输出:A 然后 B 然后 C
所以建议在每个案例之后放上 break
喜欢 :
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
)通过第一次和第二次尝试的log动作:
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 调用的 "Labels"。在 x = 1 时,控制权将转移到第 3 行并执行第 3、5 和 7 行。
自己试试 - 运行 使用 ideone 的代码可用 here.
#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
注:
- 它将执行所选案例中的所有选项,直到它看到
break
或 switch
语句结束。所以可能只有 C 被执行,或者 B 然后 C,或者 A 和 B 和 C,但从不执行 A 和 C
- 如果在handle函数中改变switch分析的变量值(例如
doA
),不会影响上述流程
没有 break 语句,每次在 switch 中出现匹配时,该 case 和后续 CASES 的语句都会执行,直到遇到 break 语句或 switch 结束。
我正在看的这本书是:
问如果我在 switch-case 语句中省略 break 会怎样?
A break 语句使程序执行能够退出 switch 构造。 没有它,执行将继续评估以下 case 语句。
假设我的代码看起来像
switch (option}{
case 1:
do A;
case 2:
do B;
default:
do C;
break;
}
这是否意味着如果我选择案例1,A和C就完成了。如果我选择案例 2,B 和 C 就完成了。如果两者都不选,则只完成C
如果是这样,如果我们在执行 C 之后省略 break 会发生什么。
我认为这些都是糟糕的编程习惯,但我很好奇会发生什么来更深入地了解它是如何工作的。谢谢
您执行从所选案例开始的所有操作,直到您看到 break
或 switch
语句结束。所以可能只有 C 被执行,或者 B 然后 C,或者 A 和 B 和 C,但从不执行 A 和 C
如果您在任何情况下都不包含 break,那么下面的所有 case 都将被执行,直到它看到 break。
如果您不在默认情况下包含 break,那么它将不会产生任何效果,因为在这个 'Default' 案例之下没有任何案例。
不使用 break 通常被认为是一种不好的做法,但有时它也可能派上用场,因为它会失败 nature.For 示例:
案例选项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
关键字...
这意味着 break 结束 switch
的执行 --> case
输出:A 然后 B 然后 C
所以建议在每个案例之后放上 break
喜欢 :
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
)通过第一次和第二次尝试的log动作:
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 调用的 "Labels"。在 x = 1 时,控制权将转移到第 3 行并执行第 3、5 和 7 行。
自己试试 - 运行 使用 ideone 的代码可用 here.
#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
注:
- 它将执行所选案例中的所有选项,直到它看到
break
或switch
语句结束。所以可能只有 C 被执行,或者 B 然后 C,或者 A 和 B 和 C,但从不执行 A 和 C - 如果在handle函数中改变switch分析的变量值(例如
doA
),不会影响上述流程
没有 break 语句,每次在 switch 中出现匹配时,该 case 和后续 CASES 的语句都会执行,直到遇到 break 语句或 switch 结束。