4种语言布尔类型值的比较

这篇博客探讨了C语言、C++、Java、JavaScript和Objective-C中布尔类型的实现和差异。C语言在C99之前没有布尔类型,C++引入了bool关键字,Java的boolean是1字节,JavaScript只有true和false,Objective-C则有BOOL和bool两种形式,其中BOOL是signed char类型。文章还提醒在OC中使用BOOL时要注意非0值可能被视为true。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

各语言的布尔值 和空值

C语言:
在C99出现之前,C语言是没有布尔类型的,只能使用宏定义定义
typedef enum{false=0, true=1} bool; //注意这里的false和true其实表示的是int类型
而在C99中定义了一个头文件stdbool.h
#define bool    _Bool
#define true    1
#define false   0
对bool做了声明,此时它还是int类型。

C++语言:
bool类型实际上是C++引入的。false/true是标准C++语言里面新增的关键字。而FALSE/TRUE是通过
#define,这是为了解决程序在C于C++环境的差异。以下是FALSE/TRUE在windef.h的定义:
#ifndef   FALSE
#define   FALSE   0
#endif
#ifndef   TRUE
#define   TRUE   1
#endif
也就是说FALSE/TRUE是int类型,而false/true是bool类型;所以两者不一样的,只不过
我们在使用中没有这种感觉,因为C++会帮你做隐式转换。

BOOL值是宏定义,对应TRUE , FALSE. 1表示TRUE, 0表示FALSE。一般用0表示FALSE,非0表示真。

bool在C++是1个字节,而BOOL是int类型,大小视具体环境而定。
BOOL在windef.h中定义 typedef int BOOL;


Java语言,布尔类型关键字为boolean,对应true和false。1字节。
JavaScript 布尔(逻辑)只能有两个值:true 或 false。
var x=true
var y=false
javascript继承了java语言的特征,容易理解


objective-c语言,类似布尔类型关键字有2个,
一种是BOOL,对应YES和NO,这种是OC自己创造的。
一种是bool,对应true和false。这种是沿用的C99标准,因为OC是c的超集,自然支持C99。
在obj.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
在OC中,
BOOL 是一个Objective-C 类型,signed char;这里容易出现的一个问题,BOOL并非是一个真正的
布尔类型值,因为他有8位,如果一个数18,那它作为BOOL返回时是什么值呢,18:00010010,最末尾是0,返回NO。因此在OC中,使用BOOL变量时,记住只与YES和NO比较。

为什么OC的BOOL值与C的BOOL值不一样,(unsigned char 和int),是因为OC的BOOL值比C99出现早10年。

bool . You can use the (C99) bool type, Many of the C frameworks (CoreFoundation, CoreGraphics, etc.) use C99 bool. All of the Objective-C frameworks use BOOL

使用举例:
BOOL - YES/NO. bool - true/false.

See examples:

bool b1 = 2;
if (b1) printf("REAL b1 \n");
if (b1 != true) printf("NOT REAL b1 \n");

BOOL b2 = 2;
if (b2) printf("REAL b2 \n");    //这里判断的是bool类型,非0值被判定为true。
if (b2 != YES) printf("NOT REAL b2 \n");
 //这里是BOOL类型值判定,最低位是0,不等于YES(1),因此结果也满足。

And result is

    REAL b1
    REAL b2
    NOT REAL b2
Note that bool != BOOL. Result below is only ONCE AGAIN - REAL b2

b2 = b1;    //b1是bool类型值,其值为true,1
if (b2) printf("ONCE AGAIN - REAL b2 \n");  //下面判断是否为true,显然是true的。
if (b2 != true) printf("ONCE AGAIN - NOT REAL b2 \n");

If you want to convert bool to BOOL you should use next code

BOOL b22 = b1 ? YES : NO; //and back - bool b11 = b2 ? true : false;

So, in our case:

BOOL b22 = b1 ? 2 : NO;
if (b22)    printf("ONCE AGAIN MORE - REAL b22 \n");
if (b22 != YES) printf("ONCE AGAIN MORE- NOT REAL b22 \n");

And so.. what we get now? :-)

You could, instead of using the ternary operator use !!b1. To convert between them –

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值