关于一种条件语句的写法 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DataPacket
CDN77
guyeu
V2EX    编程

关于一种条件语句的写法

  •  
  •   guyeu 2019-08-21 14:35:55 +08:00 5321 次点击
    这是一个创建于 2317 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在写代码时经常有通过多个条件进行分支判断的情况,一般而言 n 个 bool 值的组合会有 2种情况,以下是一个两个条件的例子:

    boolean a; boolean b; if (a) { if (b) { } else { } } else { if (b) { } else { } } 

    有些人会更喜欢写成这样:

    boolean a; boolean b; if (a && b) { } else if (a && !b) { } else if (!a && b) { } else { } 

    也有人会更习惯用位操作来实现标志位来进行这种分支的演算,想问下大佬们一般遇到这种怎么写?

    16 条回复    2019-08-22 01:12:34 +08:00
    momocraft
        1
    momocraft  
       2019-08-21 14:38:27 +08:00   1
    后一种可以让多个组合(如: a^b )用同一个 block
    guyeu
        2
    guyeu  
    OP
       2019-08-21 14:45:08 +08:00
    @momocraft #1 这其实和`((a && b) || (!a && !b))`没有实质差别,并且增加了理解难度
    momocraft
        3
    momocraft  
       2019-08-21 14:50:22 +08:00
    @guyeu 没关系,你不需要和我一起写代码
    Building
        4
    Building  
       2019-08-21 14:53:04 +08:00 via iPhone
    这个得看具体语义和场景吧,第二种以后要是再多个 c...
    lukaz
        5
    lukaz  
       2019-08-21 14:53:50 +08:00
    分支怎么少怎么来
    wu67
        6
    wu67  
       2019-08-21 15:03:40 +08:00   2
    就我个人而言, 我喜欢搭配 return 然后尽量消灭 else, 就是一路 if 下来那种
    zwzmzd
        7
    zwzmzd  
       2019-08-21 18:42:09 +08:00 via Android
    条件多的时候应该做一张真值表,少的话随便了
    Akiyu
        8
    Akiyu  
       2019-08-21 18:47:07 +08:00
    感觉第一种判断语句的粒度更小, 更容易理解和维护
    AV1
        9
    AV1  
       2019-08-21 19:02:57 +08:00 via Android
    第一种更容易扩展。比如后期想要在 if b 之前增加一些代码
    zackwu
        10
    zackwu  
       2019-08-21 19:56:09 +08:00
    从程序语义上来看,如果`a`和`b`不都是纯表达式(即有副作用,如`stack.pop()`),那么两者是不等价的;

    即便`a`和`b`都是纯表达式,如果这个表达式计算代价太大,那么第二种写法导致的重复计算会降低效率;

    当然,更多的情况是`a`和`b`都是极其普通的表达式,那就只是代码风格问题了。
    zackwu
        11
    zackwu  
       2019-08-21 19:58:36 +08:00
    至于最后一种,位运算设置标志位,感觉这种做法只是在 C 和 C++中比较多见...好处是省了空间,除此之外,我没觉得有啥优点。(此处不太了解,望指正
    guyeu
        12
    guyeu  
    OP
       2019-08-21 22:21:56 +08:00
    @keith1126 #11 如果分支情况有很多的话,标志位是比较有优势的。比如多个按钮的状态叠加。如果只是简单两三个条件的叠加,那都无所谓了。
    favourstreet
        13
    favourstreet  
       2019-08-21 23:18:48 +08:00 via Android
    觉得 if 套 if 难看就 if 套函数,函数里再套 if 呀
    murmur
        14
    murmur  
       2019-08-21 23:28:42 +08:00
    相信编译器和压缩工具,都 2019 年了,还有人认为代码长度反比与执行效率么
    guyeu
        15
    guyeu  
    OP
       2019-08-22 00:06:10 +08:00
    @murmur #14 是什么给了你错觉认为这个问题和执行效率有关?
    laike9m
        16
    laike9m  
       2019-08-22 01:12:34 +08:00 via Android
    @wu67 很多人都推荐这种风格
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5235 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 140ms UTC 01:21 PVG 09:21 LAX 17:21 JFK 20:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86