簡體   English   中英

在 C 中使用 true 和 false

[英]Using true and false in C

據我所知,在 c 中有 3 種使用布爾值的方法

  1. 使用 bool 類型,然后使用 true 和 false
  2. 使用預處理器定義#define FALSE 0 ... #define TRUE !(FALSE)
  3. 只是直接使用常量,即 1 和 0

我錯過了其他方法嗎? 不同方法的優缺點是什么?

我想最快的是數字 3,2 仍然更容易閱讀(盡管按位否定會稍微增加開銷),1 是最易讀的,與所有編譯器不兼容。

如果您的系統提供了<stdbool.h>只需包含它。 這定義了許多宏,包括boolfalsetrue (分別定義為_Bool 、 0 和 1 )。 有關更多詳細信息,請參閱 C99 的第 7.16 節。

只需在代碼中直接使用 0 或 1。

對於 C 程序員來說,這就像真假一樣直觀。

我通常做一個:

typedef enum {FALSE = 0, TRUE} boolean;

無論您選擇這三個中的哪一個,將您的變量與 FALSE 或 false 進行比較。

從歷史上看,在 c 或 c++ 中將任何內容與 true (1) 進行比較是一個壞主意。 只有 false 保證為零 (0)。 True 是任何其他值 許多編譯器供應商在其頭文件中的某處都有這些定義。

#define TRUE 1
#define FALSE 0

這導致太多人走上花園小徑。 除了chartype之外的許多庫函數在成功時返回不等於1非零值。 有大量具有相同行為的遺留代碼。

使用 stdbool.h 定義的 bool 類型,當您需要將代碼從支持 bool 類型的較新編譯器移動到較舊編譯器時會出現問題。 當您使用基於舊版本規范的 C 編譯器遷移到新架構時,這可能會發生在嵌入式編程環境中。

總而言之,當便攜性很重要時,我會堅持使用宏。 否則,按照其他人的建議並使用內置類型。

您可以測試是否在 c99 stdbool.h 中定義了 bool

#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif

我會選擇 1。我沒有遇到不兼容的情況,更自然。 但是,我認為它是 C++ 的一部分,而不是 C 標准。 我認為使用定義或您的第三個選項進行骯臟的黑客攻擊 - 不會獲得任何性能,而只會使維護代碼變得痛苦。

我更喜歡 (1) 當我定義一個變量但在表達式中我從不與 true 和 false 比較時只采用 if(flag) 或 if(!flag) 或 if(ptr) 的隱式 C 定義。 這就是 C 的做事方式。

任何非零的 int 都是真的; 假為零。 這樣,像這樣的代碼會繼續按預期工作:

int done = 0;   // `int` could be `bool` just as well

while (!done)
{
     // ...
     done = OS_SUCCESS_CODE == some_system_call ();
}

IMO, bool是一種被高估的類型,可能是其他語言的結轉。 int作為布爾類型工作得很好。

我曾經使用 #define 是因為它們使代碼更易於閱讀,並且與使用數字 (0,1) 相比,性能應該不會下降,因為預處理器會在編譯前將 #define 轉換為數字。 一旦應用程序運行,預處理器就不會再出現,因為代碼已經編譯好了。

順便說一句,它應該是:

#define FALSE 0 
#define TRUE 1

並記住 -1、-2、... 2、3 等都評估為真。

不知道你具體情況。 回到我編寫 C 程序時,我們一直使用 #2。

#define FALSE = 0
#define TRUE = !FALSE

否則,這可能是在 DOS 或基於 Intel 的處理器的外來平台下。 但是我曾經同時使用 C 和 ASM 來編寫圖形庫和圖形 IDE。 我是Micheal Abrash的忠實粉絲,並打算學習紋理映射等。 反正! 這不是這里問題的主題!

這是在 C 中定義布爾值最常用的形式,因為當時這個頭文件 stdbool.h 不存在。

沒有真正的速度差異。 它們對編譯器來說都是一樣的。 不同之處在於人類試圖使用和閱讀您的代碼。

對我來說,這使 bool、true 和 false 成為 C++ 代碼中的最佳選擇。 在 C 代碼中,有一些編譯器不支持 bool(我經常不得不使用舊系統),所以在某些情況下我可能會使用定義。

1 是最易讀的,與所有編譯器不兼容。

沒有 ISO C 編譯器具有稱為bool的內置類型。 ISO C99 編譯器有一個類型_Bool和一個 typedef 的bool頭文件。 因此,如果編譯器不兼容 C99(例如 VC++),則兼容性只是提供您自己的頭文件的一種情況。

當然,更簡單的方法是將 C 代碼編譯為 C++。

我更喜歡第三個解決方案,即使用 1 和 0,因為當您必須測試條件是真還是假時,它特別有用:您可以簡單地將變量用於 if 參數。
如果您使用其他方法,我認為為了與其余代碼保持一致,我應該使用這樣的測試:

if (variable == TRUE)
{
   ...
}

代替:

if (variable)
{
   ...
}

我更喜歡使用

#define FALSE (0!=0) 
#define TRUE  (0==0)

或直接在代碼中

if (flag == (0==0)) { ... }

編譯器會處理這個。 我使用了很多語言,不得不記住 FALSE 為 0 使我很困擾; 但如果必須的話,我通常會考慮那個字符串循環

do { ... } while (*ptr);

這讓我看到 FALSE 是 0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM