object-c中非零不一定是yes

来源:互联网 发布:nosql数据库是什么 编辑:程序博客网 时间:2024/04/30 20:21

Object-C 中的布尔类型: 中的布尔类型: 早期的 C 语言中是没有布尔类型的(C99 增加了布尔类型) ,Object-C 中增加 BOOL 类型来表 示 YES、NO,注意不是 TRUE、FALSE。

BOOL 使用了一个 8 位(一个字节)的整数进行表示, 8 位全0 就是 NO。

我们知道 C 语言中非 0 值即为逻辑真, 因此常常会有 int i=5;while(i){… …}的写法。

Object-C 在 中一定要注意慎用 C 语言中的这种数字与逻辑真假混合对待的做法去操作 BOOL 类型变量。

例如: BOOL bi=8960; if(bi==YES){ printf("YES"); } 这里会输出 YES 吗?不会的。

为什么呢?8960 是非 0 值,它不是逻辑真吗?

还记得上面说 过 BOOL 是一个 8 位的整数吗?

因为 8960 用二进制表示是大于 8 位的, 也就是说高位无效, 只保留 8960 的低八位,8960 的低八位恰好全都是 0,因此 bi 就是 NO 了。

因此在Object-C 中一定要注意这个问题,非零值未必是 BOOL 的 YES,但是 0 一定是 NO。

所以有 C 语言编程经验的,最好不要把 BOOL 与整数掺合在一起作为布尔类型的判断,可能 C 语言的开发者认为直接用数字作为布尔值进行判断在写法上更为简洁。

 

BOOL b = 8960;

if (b) {

NSLog(@"yes");

}else{

NSLog(@"no");

}

if (8960) {

NSLog(@"yes");

}else{

NSLog(@"no");

}

2013-08-22 15:39:24.443 ListDemo[9660:11303] no

2013-08-22 15:39:24.444 ListDemo[9660:11303] yes


object-c中非零不一定是yes

本文固定链接: http://palmsky.net/?p=4237 | 掌中天际


原创粉丝点击