V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Cheez
V2EX  ›  C

请教大家一个简单的 C 语言问题.

  •  
  •   Cheez · 2018-12-30 16:51:31 +08:00 · 4911 次点击
    这是一个创建于 2159 天前的主题,其中的信息可能已经有所发展或是发生改变。
    #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 ->不是,跳出逻辑

    37 条回复    2019-01-01 08:32:00 +08:00
    Alain1995
        1
    Alain1995  
       2018-12-30 16:53:37 +08:00 via Android   ❤️ 1
    不判断是不是 5 直接执行。
    Alain1995
        2
    Alain1995  
       2018-12-30 16:54:23 +08:00 via Android   ❤️ 2
    没有 break 会一直执行。
    twistedmeadows
        3
    twistedmeadows  
       2018-12-30 16:54:36 +08:00 via Android
    不是的,你自己不主动 break 掉,它就继续向下执行到 break 的地方。
    像你没有写 default 分支,编译器通常会自动加一个空的 default 分支 break 掉
    shuax
        4
    shuax  
       2018-12-30 16:55:00 +08:00 via Android
    那还要 break 干什么?
    lostspirit0
        5
    lostspirit0  
       2018-12-30 16:55:31 +08:00 via iPhone
    要加 break 的 要不然就直接执行完
    chinvo
        6
    chinvo  
       2018-12-30 16:57:25 +08:00 via iPhone
    case 只是个 tag,不是流程控制关键字,也就是需要你自己 break
    yucao
        7
    yucao  
       2018-12-30 17:01:56 +08:00
    想多了,找你的逻辑 break 有没有就没关系了...显然是错误的
    aijam
        8
    aijam  
       2018-12-30 17:06:01 +08:00   ❤️ 3
    从语义上说,switch 相当于 goto,case/default 相当于 label。
    innoink
        9
    innoink  
       2018-12-30 17:10:08 +08:00
    “他的逻辑不是这样吗……”
    你从哪学的?
    Vtwoguest
        10
    Vtwoguest  
       2018-12-30 17:11:41 +08:00
    case 穿透
    csysly123
        11
    csysly123  
       2018-12-30 17:22:01 +08:00
    case 是从当前语句开始执行,你的 ch2='B',就从 case 'B'开始执行,不会主动跳出
    xfriday
        12
    xfriday  
       2018-12-30 17:29:04 +08:00   ❤️ 1
    go 才是你说的那样,c 里 case 到了不会主动 break
    Nasei
        13
    Nasei  
       2018-12-30 17:34:56 +08:00   ❤️ 4
    现在学编程都不用看书了么...
    smdbh
        14
    smdbh  
       2018-12-30 18:00:02 +08:00   ❤️ 1
    恩,这可能是 c 的一个 bug 吧。不用就没事了
    Yut
        15
    Yut  
       2018-12-30 18:06:17 +08:00 via Android
    break 啊老哥,又是一个被新语言惯坏的年轻人(笑
    xiri
        16
    xiri  
       2018-12-30 18:11:15 +08:00 via Android   ❤️ 1
    “他的逻辑不是这样吗: 判断是不是 B -> 没有 break -> 判断是不是 5 ->不是,跳出逻辑”

    ,,,,,
    请先去了解 switch 的基础语法再来提问
    zhang1215
        17
    zhang1215  
       2018-12-30 18:11:43 +08:00
    不看书自己总结规律吗?
    ETiV
        18
    ETiV  
       2018-12-30 18:52:35 +08:00 via iPhone   ❤️ 1
    如果程序员都这水平,估计到明年就会被 AI 超越了吧…
    DavidNineRoc
        19
    DavidNineRoc  
       2018-12-30 19:02:38 +08:00
    恩,这可能是 c 的一个 bug 吧。不用就没事了。 希望楼主能去 github 提一个 pr,为中国开源界做贡献
    GTim
        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 为止
    inframe
        21
    inframe  
       2018-12-30 19:46:59 +08:00
    break 都没有了。。。
    kljsandjb
        22
    kljsandjb  
       2018-12-30 19:54:54 +08:00 via iPhone
    第一个发生 fall through,建议把基础的东西补补…
    chenqh
        23
    chenqh  
       2018-12-30 20:02:01 +08:00
    估计是忘了 switch 要 break 了把
    jiejiss
        24
    jiejiss  
       2018-12-30 20:23:12 +08:00 via Android
    按照你的说法,要 break 有什么用。。。反正后面的 case 不符合就会自动跳出,写 break;还得敲六下键盘
    qiuyi116
        25
    qiuyi116  
       2018-12-30 21:33:52 +08:00 via iPhone
    ls 说了。没有 break 会继续执行。switch 的实现是跳转表,case 就是一个 tag,找到对应的 tag 位置后开始执行,如果不 break 会继续往后面执行。break 会跳转出 switch 的代码块。
    creanme
        26
    creanme  
       2018-12-30 22:22:28 +08:00
    请教一下 V2EX 是怎么贴代码的。
    dai201617
        27
    dai201617  
       2018-12-30 23:11:48 +08:00
    哈哈哈课设验收的时候我也曾经遇到过这个问题
    ericgui
        28
    ericgui  
       2018-12-31 02:09:21 +08:00
    case 满足后要 break
    ThomasZ
        29
    ThomasZ  
       2018-12-31 02:46:47 +08:00 via Android
    break 呢,没有 break 会向下继续,直到 default
    msg7086
        30
    msg7086  
       2018-12-31 06:55:34 +08:00
    Case 是跳转。神™判断。哪来的判断啊。
    enchilada2020
        31
    enchilada2020  
       2018-12-31 08:45:40 +08:00   ❤️ 2
    这可真是 人家都说了是一个简单的问题 你们就简单的看看 能答就好好答一下 不能答就一笑而过好了 群嘲算什么 那么多需要解答的问题下都空着呢 有能力不去答一下么?
    roshad
        32
    roshad  
       2018-12-31 08:48:20 +08:00
    你假如是在学 C,马上换掉你现在用的书,以免误入歧途。
    roshad
        33
    roshad  
       2018-12-31 08:50:20 +08:00
    我推荐你 c programming:a modern approach
    aijam
        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。
    loading
        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");
    }
    sunzhenyucn
        36
    sunzhenyucn  
       2018-12-31 18:54:26 +08:00
    推荐这本书《 Learn C the hard way 》
    nichijou
        37
    nichijou  
       2019-01-01 08:32:00 +08:00
    新学有疑问很正常,但是这个问题不需要发帖,随便搜一下就会有答案。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3908 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 10:24 · PVG 18:24 · LAX 02:24 · JFK 05:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.