C語言中的真假值

來源:互聯網
上載者:User
文章目錄
  • 2. 使用_Bool
  • 3. 使用stdbool.h

     也許很多人都和我一樣,不知道現在的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 true1#define false0#else /* __cplusplus ,應用於C++裡,這裡不用處理它*//* Supporting <stdbool.h> in C++ is a GCC extension.  */#define _Boolbool#define boolbool#define falsefalse#define truetrue#endif /* __cplusplus *//* Signal that all the definitions are present.  */#define __bool_true_false_are_defined1#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)/*判斷null 指標*/

尤其在linux的代碼中有很多這樣的判斷(採用前面的方法),如driver的probe函數的出錯處理,而且linux中一般函數正確的傳回值是0,錯誤傳回值為負數,如下面的判斷:

 ret = platform_device_register(&this_device);
   if (ret)/註冊失敗/
         platform_driver_unregister(&this_driver);

直接寫變數的好處是,
1)節省儲存空間,不需另外分配空間。
2)運算速度加快,只需與零值比較。

原文地址:C語言的布爾類型(_Bool)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.