开关大小写语句不间断
switch-case statement without break
根据我正在阅读的这本书:
问:如果我在开关大小写语句中省略了中断,会发生什么情况?
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 之后省略中断会发生什么。
我认为这些都是糟糕的编程实践,但我很好奇会发生什么才能更深入地了解它是如何工作的。谢谢
从所选大小写开始执行所有内容,直到看到break
或 switch
语句结束。所以可能只执行 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
注意:
- 它将执行所选案例中的所有选项,直到看到
break
或switch
语句结束。所以可能只执行 C,或者 B 然后执行 C,或者 A 和 B 和 C,但永远不会执行 A 和 C - 如果更改句柄函数内开关中分析的变量的值(例如
doA
(,则不会影响如上所述的流量
如果没有中断语句,每次交换机中发生匹配时,该情况和后续情况的语句都会执行,直到遇到中断语句或交换机结束。
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 为什么我的 if else 语句不起作用并从数组中输出正确的索引?
- 如果语句逻辑不正确
- 如果仍然不满足要求,如何使 if 语句重复?
- C++ 中的"if"语句不会从左到右计算条件
- 多个'if'语句,不带'else'
- 如果不是多个语句,请使用 if 语句
- 如果语句不包括文本行?
- 而不是那么多的 if 语句,我想要一个逻辑,我可以用一个语句或优化的方式来完成
- 调用多个类而不带 if 语句
- C++中的不间断功能
- 返回 std::string 的函数在没有 return 语句的情况下崩溃,这与返回 int 而不返回语句的函数不同
- 开关/机箱不间断循环
- 开关大小写语句不间断
- 不间断地执行Cpp Linux代码
- 为什么不为语句调用 A 的构造函数"A x(A())"?
- 在循环中不间断地从list中删除元素
- 如何不间断地提前结束一个循环
- 一个leetcode progra,不理解语句