关于BOOL比较的问题

2012-01-19 16:48:53 +08:00
 godwarlock
很多代码规范上都写不能用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
}

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

if ( ! a ) {
}


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

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

甚至Pointer都是这样
void *foo = NULL;
if ( foo ) 或者 if ( !foo )
evlos
2012-01-19 18:02:49 +08:00
感觉 YES NO 什么的太奇怪了,读到会蛋疼的,正常情况下应该都用 TRUE FALSE 的吧。
fly2never
2012-01-19 18:05:14 +08:00
@evlos objc中,BOOL型都是yes/no
fly2never
2012-01-19 18:06:11 +08:00
@guoxx_ 但是如果a定义为BOOL型,那么只可能是0/1,只是int转型为BOOL时需要小心
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
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
2012-01-19 19:06:14 +08:00
BOOL类型的变量一般用isXXX、hasXXX的形式来命名,这样if (hasError) {...}的可读性是很好的。
qianleilei
2012-01-19 20:23:50 +08:00
有时候 if(!a) 会让我想很久,前两天就是因为少一个!,出了一个bug
evlos
2012-01-19 23:16:08 +08:00
@fly2never 。。。。。。汗 O_O
godwarlock
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_
2012-01-20 09:23:33 +08:00
没想到这种问题还有这么多讨论,基本入门的教材都已经写得很清除了
代码翻译到汇编的时候 执行的都是和0比较 BOOL类型不过是objc的扩展 不同于c++的bool类型

if ( a == YES ) 这种写法在任何情况下都强烈不推荐 可读性的问题可以通过变量名解决
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
2012-01-21 01:20:38 +08:00
@lldong 哦,sorry,这个是我弄错了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/25864

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX