zoukankan      html  css  js  c++  java
  • bool和BOOL类型知识集合

    知识点一、C语言中有bool类型吗?  

     转自http://blog.csdn.net/liuqiqi677/article/details/6703615

         之前一直都没有注意到,最近在用C语言写DSP算法时,偶然间发现我函数中定义的bool类型的变量在VC6.0(我主要用它来检查一下语法错误)中编译居然报错了,说是bool类型没有定义。用了这么久的C和C++了,一直觉得bool这种基本类型,应该是C语言内置的类型,怎么会没有定义呢?事实证明,我的想法完全错误了。

          有了网络,一切问题都变得那么容易了,我很容易地搜到了相关的解答。

          C语言里面是没有bool(布尔)类型的,C++里面才有,这就是说,在C++里面使用bool类型是没有问题的。bool类型有只有两个值:true =1 、false=0。

          但是,C99标准里面,又定义了bool类型变量。这时,只要引入头文件 <stdbool.h>,就能在C语言里面正常使用bool类型。这点我在Fedora9下验证过了,它自带的编译器是 gcc 4.3.0,符合C99标准。但是在VC6.0中,会报找不到头文件 stdbool.h 的错误,看来VC6.0确实比较老了。

          所以,为了兼容各种编译器,还是自己定义吧。^_^

                #define bool char
                #define ture 1
                #define false 0

     C99标准定义了一个新的关键字_Bool,提供了布尔类型。以前,C程序员总是使用自己的方法定义布尔类型。

            0表示false,非0表示true。

            可能使用char类型表示一个布尔类型,也可能使用int类型表示一个布尔类型。

             很多函数库都定义了自己的布尔类型和相应的宏,枚举,typedef。

             现在C99把C语言原生的布尔类型带来了。

    #include<stdbool.h> 

    这个头文件定义了bool,true,false等宏。

    #ifndef__cplusplus

    如果不是C++,是纯C,那么,定义宏bool相当于_Bool类型。

    #definebool _Bool

    #definetrue 1

    #definefalse 0

     

    #else/* __cplusplus */

    如果是C++,那么定义_Bool类型为bool类型。

    /*Supporting <stdbool.h> in C++ is a GCC extension. */

    #define_Bool bool

    #definebool bool

    #definefalse false

    #definetrue true

    #endif/* __cplusplus */

    /*Signal that all the definitions are present. */

    #define__bool_true_false_are_defined 1

    看看上面这个宏是否==1,如果是,表示上面这些定义可用。

    C2008草案中说:

         Anobject declared as type _Boolis large enough to store the values 0 and1.

            也就是说,只规定了_Bool类型的大小是至少能够存放0和1这两个值。并没有规定具体的大小。这交给编译器自由发挥了。

    我用gcc做了一下测试:

    printf("sizeof(bool):%d ",sizeof(bool));

    printf("sizeof(char):%d ",sizeof(char));

    printf("sizeof(int):%d ",sizeof(int));

    printf("sizeof(long):%d ",sizeof(long));

    --sizeof(bool):1

    --sizeof(char):1

    --sizeof(int):4

    --sizeof(long):8

    看来gcc是用char来实现_Bool类型的。

    看看给_Bool类型赋值会怎样:

    boolboolean=-11212112;

    printf("boolean:%d ",boolean);

    --boolean:1

           看来,gcc编译器对待_Bool类型有自己的转换处理。如果是0赋值给_Bool类型,那么就赋值0。如果是任意其他数据,那么会赋值为1!(只是不知道其他编译器是否如此处理,C2008标准草案没有细说这个部分) 

          以前一直用!逻辑非运算符:

    if(!flag){

    }

         来表示0和非0。现在_Bool类型就只有0和1这两个值!

    知识点2、objective-c中的BOOL类型

    1.objective-c中的 BOOL类型 实际上是一种带符号的字符类型(signed char)的定义(typedef),它使用8位存储空间。YES定义1,NO定义为0。

    objective-c并不将BOOL类型作为仅能保存YES或NO的真正布尔类型来处理。编译器将BOOL认做一个8位二进制数,YES或NO只是一种约定。

    如果不小心将一个长于1字节的整型值(例如short,int值)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。假设该低位字节刚好为0(例如8960,写成16进制为0x2300),

    BOOL值将会是0,即NO值。

    FALSE/TRUE与false/true的区别
    1.FALSE/TRUE与false/true的区别:
    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++会帮你做隐式转换。
    2.bool的大小与BOOL的区别:
    bool在C++里是占用1字节,而BOOL是int类型,int类型的大小是视具体环境而定的;所以
    来说:false/true只占用1个字节,而TRUE/FALSE视具体环境而言,以下是BOOL在windef
    .h中的定义:typedef int BOOL;
    3.NULL与0的区别:
    还是让我们看一下windef.h中NULL的定义:
    #ifndef NULL
    #ifdef __cplusplus//这个是指示是用C++来编译程序
    #define NULL 0
    #else
    #define NULL ((void *)0)
    #endif
    #endif
    所以说:它们没有区别,只不过在C里面会做一个强制类型转换。

    知识点三、bool和BOOL区别

    一、 
    1、类型不同 
    BOOL为int型 
    bool为布尔型 
    2、长度不同 
    bool只有一个字节 
    BOOL长度视实际环境来定,一般可认为是4个字节 
    3、取值不同 
    bool取值false和true,是0和1的区别 
    BOOL取值FALSE和TRUE,是0和非0的区别 
    二: 
    bool是标准C++数据类型,可取值true和false。单独占一个字节, 
    如果数个bool对象列在一起,可能会各占一个bit,这取决于编译器。 

    BOOL是微软定义的typedef int BOOL。与bool不同,它是一个三值逻辑, 
    TRUE/FALSE/ERROR,返回值为>0的整数为TRUE,0为FALSE,-1为ERROR。 
    Win32 API中很多返回值为BOOL的函数都是三值逻辑。比如GetMessage(). 
    三: 
    大BOOL和小bool之间的区别: 
    1、类型不同 
    BOOL为int型 
    bool为布尔型 
    2、长度不同 
    bool只有一个字节 
    BOOL长度视实际环境来定,一般可认为是4个字节 
    3、取值不同 
    bool取值false和true,是0和1的区别 
    BOOL取值FALSE和TRUE,是0和非0的区别 
    4、例子 
    bool x=3;  //告警 
    bool x=1;  //正确 
    BOOL x=3;  //正确 
    BOOL x=3.3;  //告警 
    注:windows为了兼容问题定义的基础变量。 
    typedef unsigned long        DWORD; 
    typedef int                  BOOL; 
    typedef unsigned char        BYTE; 
    typedef unsigned short      WORD; 
    typedef float                FLOAT; 
    typedef FLOAT                *PFLOAT; 
    typedef BOOL near            *PBOOL; 
    typedef BOOL far            *LPBOOL; 
    typedef BYTE near            *PBYTE; 
    typedef BYTE far            *LPBYTE; 
    typedef int near            *PINT; 
    typedef int far              *LPINT;

    总结:关于这些布尔值之类的判断为真的情况很多,但是为假的情况一般就一种  值等于0的时候为假,所以在进行判断的时候我们可以把返回值是否为假作为判断条件。

  • 相关阅读:
    制作Windows Server 2008安装启动U盘
    wireshark教程(一)
    TCPdump抓包命令详解
    ATM交换机 和普通交换机区别
    胖ap和瘦ap区别
    酒店网络非常常见故障一例
    JQuery EasyUI DataGrid动态合并(标题)单元) 一
    字典表左右选择
    treegrid-dnd.js
    MySQL开发规范
  • 原文地址:https://www.cnblogs.com/lisuyun/p/3990335.html
Copyright © 2011-2022 走看看