V2EX 首页   注册   登入
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请 登入
iOS 开发实用技术导航
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Cocoa with Love
http://cocoawithlove.com/
iOS 开发实用书单
iPhone App Development: The Missing Manual
Cocoa and Objective-C: Up and Running
Cocoa Programming for Mac OS X
深入浅出设计模式 Head First Design Patterns
Useful Tools
Charles Web Debugging Proxy
Sponsored by
唐茶 字节社
中文世界最好的电子书城
V2EX  ›  iDev

关于BOOL比较的问题

By godwarlock at 125 天前, 526 次点击
很多代码规范上都写不能用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 回复  |  直到 2012-01-22 01:20:38 AM
    1
VYSE   125 天前
既然是逻辑变量,直接在if后面多合情合理?c里可以==TRUE或==FALSE
    2
guoxx_   125 天前
if ( a ) {
}

if ( ! a ) {
}


这样有什么问题么?
    3
fly2never   125 天前
关注这个问题.
我现在一般是if(a) if(!a), 如果a是一个表达式,就才采用 if (a == YES) if (a == NO)
    4
godwarlock   125 天前
@guoxx_ 从实现上没问题,但是觉得降低了可读性
    5
guoxx_   125 天前
if(a == YES) if(a == NO)
这样写法 绝对是错误的

int a = 100;
if ( a ) 和 if ( a == YES ) 完全是俩码事
    6
guoxx_   125 天前
@godwarlock K&R C就是这种风格

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

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

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

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

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

if ( a == YES ) 这种写法在任何情况下都强烈不推荐 可读性的问题可以通过变量名解决
    17
lldong   124 天前
有个问题,关于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
    18
godwarlock   124 天前
@lldong 哦,sorry,这个是我弄错了
Linode
关于   |   FAQ   |   我们的愿景   |   广告投放   |   工作空间   |   Gadget Lab   |   博客   |   上网首页   |   309 人在线   最高记录 362
创意工作者们的社区
Lovingly made by OLIVIDA
VERSION: 3.0.0-dev
♥ Do have a faith in what you're doing.