#include<stdio.h>
main() {
char ch1, ch2 = 'B';
switch (ch2) {
case 'B':
printf("B");
case '5':
printf("B");
}
system("pause");
}
我试了一下,这样会输出 BB,可明明 ch2=B 啊。。。。为什么会同时符合两个 case
他的逻辑不是这样吗:
判断是不是 B -> 没有 break -> 判断是不是 5 ->不是,跳出逻辑
1
Alain1995 2018-12-30 16:53:37 +08:00 via Android 1
不判断是不是 5 直接执行。
|
2
Alain1995 2018-12-30 16:54:23 +08:00 via Android 2
没有 break 会一直执行。
|
3
twistedmeadows 2018-12-30 16:54:36 +08:00 via Android
不是的,你自己不主动 break 掉,它就继续向下执行到 break 的地方。
像你没有写 default 分支,编译器通常会自动加一个空的 default 分支 break 掉 |
4
shuax 2018-12-30 16:55:00 +08:00 via Android
那还要 break 干什么?
|
5
lostspirit0 2018-12-30 16:55:31 +08:00 via iPhone
要加 break 的 要不然就直接执行完
|
6
chinvo 2018-12-30 16:57:25 +08:00 via iPhone
case 只是个 tag,不是流程控制关键字,也就是需要你自己 break
|
7
yucao 2018-12-30 17:01:56 +08:00
想多了,找你的逻辑 break 有没有就没关系了...显然是错误的
|
8
aijam 2018-12-30 17:06:01 +08:00 3
从语义上说,switch 相当于 goto,case/default 相当于 label。
|
9
innoink 2018-12-30 17:10:08 +08:00
“他的逻辑不是这样吗……”
你从哪学的? |
10
Vtwoguest 2018-12-30 17:11:41 +08:00
case 穿透
|
11
csysly123 2018-12-30 17:22:01 +08:00
case 是从当前语句开始执行,你的 ch2='B',就从 case 'B'开始执行,不会主动跳出
|
12
xfriday 2018-12-30 17:29:04 +08:00 1
go 才是你说的那样,c 里 case 到了不会主动 break
|
13
Nasei 2018-12-30 17:34:56 +08:00 4
现在学编程都不用看书了么...
|
14
smdbh 2018-12-30 18:00:02 +08:00 1
恩,这可能是 c 的一个 bug 吧。不用就没事了
|
15
Yut 2018-12-30 18:06:17 +08:00 via Android
break 啊老哥,又是一个被新语言惯坏的年轻人(笑
|
16
xiri 2018-12-30 18:11:15 +08:00 via Android 1
“他的逻辑不是这样吗: 判断是不是 B -> 没有 break -> 判断是不是 5 ->不是,跳出逻辑”
,,,,, 请先去了解 switch 的基础语法再来提问 |
17
zhang1215 2018-12-30 18:11:43 +08:00
不看书自己总结规律吗?
|
18
ETiV 2018-12-30 18:52:35 +08:00 via iPhone 1
如果程序员都这水平,估计到明年就会被 AI 超越了吧…
|
19
DavidNineRoc 2018-12-30 19:02:38 +08:00
恩,这可能是 c 的一个 bug 吧。不用就没事了。 希望楼主能去 github 提一个 pr,为中国开源界做贡献
|
20
GTim 2018-12-30 19:16:02 +08:00
哈哈,看这篇文章 https://www.twle.cn/l/yufei/cprogramming/cprogramming-basic-switch.html
里面有 switch 的规则 1. 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。 2. 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。 3. 不是每一个 case 都需要包含 break。 如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止 |
21
inframe 2018-12-30 19:46:59 +08:00
break 都没有了。。。
|
22
kljsandjb 2018-12-30 19:54:54 +08:00 via iPhone
第一个发生 fall through,建议把基础的东西补补…
|
23
chenqh 2018-12-30 20:02:01 +08:00
估计是忘了 switch 要 break 了把
|
24
jiejiss 2018-12-30 20:23:12 +08:00 via Android
按照你的说法,要 break 有什么用。。。反正后面的 case 不符合就会自动跳出,写 break;还得敲六下键盘
|
25
qiuyi116 2018-12-30 21:33:52 +08:00 via iPhone
ls 说了。没有 break 会继续执行。switch 的实现是跳转表,case 就是一个 tag,找到对应的 tag 位置后开始执行,如果不 break 会继续往后面执行。break 会跳转出 switch 的代码块。
|
26
creanme 2018-12-30 22:22:28 +08:00
请教一下 V2EX 是怎么贴代码的。
|
27
dai201617 2018-12-30 23:11:48 +08:00
哈哈哈课设验收的时候我也曾经遇到过这个问题
|
28
ericgui 2018-12-31 02:09:21 +08:00
case 满足后要 break
|
29
ThomasZ 2018-12-31 02:46:47 +08:00 via Android
break 呢,没有 break 会向下继续,直到 default
|
30
msg7086 2018-12-31 06:55:34 +08:00
Case 是跳转。神™判断。哪来的判断啊。
|
31
enchilada2020 2018-12-31 08:45:40 +08:00 2
这可真是 人家都说了是一个简单的问题 你们就简单的看看 能答就好好答一下 不能答就一笑而过好了 群嘲算什么 那么多需要解答的问题下都空着呢 有能力不去答一下么?
|
32
roshad 2018-12-31 08:48:20 +08:00
你假如是在学 C,马上换掉你现在用的书,以免误入歧途。
|
33
roshad 2018-12-31 08:50:20 +08:00
我推荐你 c programming:a modern approach
|
34
aijam 2018-12-31 09:50:08 +08:00 2
@enchilada2020 同感,lz 恰恰在学习过程中找到了 c 语言设计蹩脚的地方,提出这样的问题正说明 lz 有自己消化过。为什么说 switch fallthrough 是 c 的设计失误?最直接的例证是,参与过当年 c 语言开发的 Ken Thompson 在后来设计 golang 的时候尽管保留了 switch 语法但丢弃了 fallthrough,也不用程序员每次手工 break。其他从流行的脚本语言比如 perl/ruby/python 到新一代的编译语言比如 swift/kotlin/rust 无一不如此,要不就是直接没有 switch,即使有 switch 或者接近 switch 的语法也不会有 fallthrough。
|
35
loading 2018-12-31 09:53:57 +08:00
楼主,你可以这样玩一下:
#include<stdio.h> main() { char ch1, ch2 = 'B'; switch (ch2) { case '5': printf("5"); case 'B': printf("B"); } system("pause"); } |
36
sunzhenyucn 2018-12-31 18:54:26 +08:00
推荐这本书《 Learn C the hard way 》
|
37
nichijou 2019-01-01 08:32:00 +08:00
新学有疑问很正常,但是这个问题不需要发帖,随便搜一下就会有答案。
|