V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
godwarlock
V2EX  ›  iDev

关于BOOL比较的问题

  •  
  •   godwarlock ·
    godwarlock · 2012-01-19 16:48:53 +08:00 · 6400 次点击
    这是一个创建于 4725 天前的主题,其中的信息可能已经有所发展或是发生改变。
    很多代码规范上都写不能用BOOL值直接和YES/NO进行比较,比如

    BOOL a=YES;
    if (a == NO) // 禁止
    {
    // do something
    }
    else
    {
    // do something
    }

    这样就是不对的

    原因是BOOL实际上是一个unsigned int,不仅能取值YES和NO
    但是不能这样写不就损失了代码的可读性么?

    另外,和YES不比较删掉就可以了,但是如果只需要判断NO,还需要这样写么?

    if (a)
    {
    // do nothing
    }
    else
    {
    // do something
    }

    或者

    if (!a)
    {
    // do something
    }

    想问问大家是怎么处理这个问题的?
    18 条回复    1970-01-01 08:00:00 +08:00
    VYSE
        1
    VYSE  
       2012-01-19 16:58:59 +08:00
    既然是逻辑变量,直接在if后面多合情合理?c里可以==TRUE或==FALSE
    guoxx_
        2
    guoxx_  
       2012-01-19 17:33:41 +08:00
    if ( a ) {
    }

    if ( ! a ) {
    }


    这样有什么问题么?
    fly2never
        3
    fly2never  
       2012-01-19 17:37:30 +08:00
    关注这个问题.
    我现在一般是if(a) if(!a), 如果a是一个表达式,就才采用 if (a == YES) if (a == NO)
    godwarlock
        4
    godwarlock  
    OP
       2012-01-19 17:39:48 +08:00
    @guoxx_ 从实现上没问题,但是觉得降低了可读性
    guoxx_
        5
    guoxx_  
       2012-01-19 17:41:04 +08:00
    if(a == YES) if(a == NO)
    这样写法 绝对是错误的

    int a = 100;
    if ( a ) 和 if ( a == YES ) 完全是俩码事
    guoxx_
        6
    guoxx_  
       2012-01-19 17:42:14 +08:00
    @godwarlock K&R C就是这种风格

    甚至Pointer都是这样
    void *foo = NULL;
    if ( foo ) 或者 if ( !foo )
    evlos
        7
    evlos  
       2012-01-19 18:02:49 +08:00
    感觉 YES NO 什么的太奇怪了,读到会蛋疼的,正常情况下应该都用 TRUE FALSE 的吧。
    fly2never
        8
    fly2never  
       2012-01-19 18:05:14 +08:00
    @evlos objc中,BOOL型都是yes/no
    fly2never
        9
    fly2never  
       2012-01-19 18:06:11 +08:00
    @guoxx_ 但是如果a定义为BOOL型,那么只可能是0/1,只是int转型为BOOL时需要小心
    fly2never
        10
    fly2never  
       2012-01-19 18:10:00 +08:00
    这篇文章里面写的是不要与'YES'/'NO'比较,也不要和@"YES"/@"NO"比较
    http://www.mindsizzlers.com/2010/04/objective-c-and-the-properties-of-bool/
    fly2never
        11
    fly2never  
       2012-01-19 18:12:27 +08:00
    BOOL b = 37;
    if (b) {
    printf("b is YES!\n");
    }
    if (b != YES) {
    printf("b is not YES!\n");
    }

    这样的话,b就最好不要直接和YES和NO比较
    keakon
        12
    keakon  
       2012-01-19 19:06:14 +08:00
    BOOL类型的变量一般用isXXX、hasXXX的形式来命名,这样if (hasError) {...}的可读性是很好的。
    qianleilei
        13
    qianleilei  
       2012-01-19 20:23:50 +08:00
    有时候 if(!a) 会让我想很久,前两天就是因为少一个!,出了一个bug
    evlos
        14
    evlos  
       2012-01-19 23:16:08 +08:00
    @fly2never 。。。。。。汗 O_O
    godwarlock
        15
    godwarlock  
    OP
       2012-01-20 00:33:46 +08:00
    @guoxx_ @fly2never
    我现在的一个看法是这样
    如果说 a 是一个函数调用的话,写代码的人就一定要知道这个函数的返回值是不是BOOL,如果是那么if(a == YES/NO)这样来做是无所谓的,加上了还可以增加可读性

    如果说返回值是NSInteger的话,是肯定不能写if(a == YES/NO)的

    你觉得这样做是不是合适的,另外我觉得if(!a)的可读性真的不是很好

    另外还有一个说法是,a可以和NO进行比较,因为if条件的NO永远都是0,而if条件YES却只需要>0
    guoxx_
        16
    guoxx_  
       2012-01-20 09:23:33 +08:00
    没想到这种问题还有这么多讨论,基本入门的教材都已经写得很清除了
    代码翻译到汇编的时候 执行的都是和0比较 BOOL类型不过是objc的扩展 不同于c++的bool类型

    if ( a == YES ) 这种写法在任何情况下都强烈不推荐 可读性的问题可以通过变量名解决
    lldong
        17
    lldong  
       2012-01-20 20:07:30 +08:00
    有个问题,关于BOOL的类型的问题,楼主说是unsigned int,包括一些书上也是这样说,但是我看运行时API里(/usr/include/objc/objc.h)的声明是:

    typedef signed char BOOL;
    // BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C"
    // even if -funsigned-char is used.
    #define OBJC_BOOL_DEFINED


    #define YES (BOOL)1
    #define NO (BOOL)0
    godwarlock
        18
    godwarlock  
    OP
       2012-01-21 01:20:38 +08:00
    @lldong 哦,sorry,这个是我弄错了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1077 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 22:54 · PVG 06:54 · LAX 14:54 · JFK 17:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.