C语言中的真假值

     也许很多人都和我一样,不知道现在的C语言已经有了布尔型:从C99标准开始,类型名字为“_Bool”。

        在此之前的C语言中,使用整型int来表示真假。在输入时:使用非零值表示真;零值表示假。在输出时:真的结果是1,假的结果是0;(这里我所说的“输入”,意思是:当在一个需要布尔值的地方,也就是其它类型转化为布尔类型时,比如 if 条件判断中的的条件;“输出”的意思是:程序的逻辑表达式返回的结果,也就是布尔类型转化为其他类型时,比如 a==b的返回结果,只有0和1两种可能)。(即使有了bool类型,这些依然适用,比如在kernel的代码中到处是这个准则)

        所以,现在只要你的编译器支持C99(我使用的是Dev C++4.9.9.2),你就可以直接使用布尔型了。另外,C99为了让CC++兼容,增加了一个头文件stdbool.h。里面定义了booltruefalse,让我们可以像C++一样的定义布尔类型。

1. 我们自己定义的“仿布尔型”
        在C99标准被支持之前,我们常常自己模仿定义布尔型,方式有很多种,常见的有下面两种:

/* 第一种方法 */
#define TRUE 1
#define FALSE 0


/* 第二种方法 */ 
enum bool{false, true}; 

2. 使用_Bool

        现在,我们可以简单的使用 _Bool 来定义布尔型变量。_Bool类型长度为1,只能取值范围为0或1。将任意非零值赋值给_Bool类型,都会先转换为1,表示。将零值赋值给_Bool类型,结果为0,表示。 下面是一个例子程序。

#include <stdio.h> 
#include <stdlib.h>  

int main(){
    _Bool a = 1;
    _Bool b = 2;    /* 使用非零值,b的值为1 */ 
    _Bool c = 0;
    _Bool d = -1;   /* 使用非零值,d的值为1 */ 
    
    printf("a==%d,  /n", a);
    printf("b==%d,  /n", b);
    printf("c==%d,  /n", c);
    printf("d==%d,  /n", d);

    printf("sizeof(_Bool) == %d  /n", sizeof(_Bool));
    
    system("pause");
    return EXIT_SUCCESS;
}

运行结果如下:(只有0和1两种取值)
a==1,
b==1,
c==0,
d==1,
sizeof(_Bool) == 1

3. 使用stdbool.h

        在C++中,通过bool来定义布尔变量,通过truefalse对布尔变量进行赋值。C99为了让我们能够写出与C++兼容的代码,添加了一个头文件<stdbool.h>。在gcc中,这个头文件的源码如下:(注,为了清楚,不重要的注释部分已经省略)

/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
        This file is part of GCC.
 */

#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#define bool	_Bool
#define true	1
#define false	0

#else /* __cplusplus ,应用于C++里,这里不用处理它*/

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool	bool
#define bool	bool
#define false	false
#define true	true

#endif /* __cplusplus */

/* Signal that all the definitions are present.  */
#define __bool_true_false_are_defined	1

#endif	/* stdbool.h */

         可见,stdbool.h中定义了4个宏,bool、true、false、__bool_true_false_are_defined。 其中bool就是 _Bool类型,true和false的值为1和0,__bool_true_false_are_defined的值为1。
下面是一个例子程序

#include <stdio.h> 
#include <stdlib.h> 
#include <stdbool.h>

/* 测试C99新添加的头文件 stdbool.h */

int main(){
    bool m = true;
    bool n = false;
    printf("m==%d,  n==%d  /n", m, n);
    
    printf("sizeof(_Bool) == %d  /n", sizeof(_Bool));

    system("pause");
    return EXIT_SUCCESS;
}

执行结果为:

m==1, n==0 sizeof(_Bool) == 1

PS:C语言把0作为false,非0为true。

所以才常见下面这种判断

如果a为变量

if(a)就是if(a!=0)
if(!a)就是if(a==0)

如果P为指针

if(p)<==>if (p != NULL)

if (!p)<==>if (p == NULL)/*判断空指针*/

尤其在linux的代码中有很多这样的判断(采用前面的方法),如driver的probe函数的出错处理,而且linux中一般函数正确的返回值是0,错误返回值为负数,如下面的判断:

 ret = platform_device_register(&this_device);
   if (ret)/注册失败/
         platform_driver_unregister(&this_driver);

直接写变量的好处是,
1)节省存储空间,不需另外分配空间。
2)运算速度加快,只需与零值比较。

原文地址:C语言的布尔类型(_Bool)

你可能感兴趣的:(C语言中的真假值)