在很多程序中,我看到標識爲FALSE
和false
的語句。它們在C++的環境中有什麼區別嗎?我也看到了bool
和BOOL
。這兩者之間有什麼區別?false和FALSE有什麼區別?
任何人都可以解釋這些標識符與我之間的區別嗎?謝謝。
在很多程序中,我看到標識爲FALSE
和false
的語句。它們在C++的環境中有什麼區別嗎?我也看到了bool
和BOOL
。這兩者之間有什麼區別?false和FALSE有什麼區別?
任何人都可以解釋這些標識符與我之間的區別嗎?謝謝。
如果所包含windows.h
,然後FALSE
已經#defined爲0 TRUE
已經#defined爲1。這是不布爾類型,它是一個整數類型。 Windows還定義了類型BOOL
,它實際上是一個整數類型,用於容納值爲TRUE
和FALSE
。在windows.h
看起來像這樣的代碼
的有關章節:
#ifdef FALSE
#undef FALSE
#endif
#define FALSE 0
#ifdef TRUE
#undef TRUE
#endif
#define TRUE 1
typedef int BOOL, *PBOOL, *LPBOOL;
的Windows最初是用C寫的,因爲都是原始的Windows應用程序。那時候,C沒有標準定義的布爾類型。相反,開發人員被迫定義自己的布爾常量。爲了防止可能造成的混亂,微軟決定使用所有Windows應用程序的標準。
如果您正在編寫Windows應用程序,則可能仍需要使用TRUE
和FALSE
標識符。在windows.h
中定義的幾個函數要麼接受布爾參數(實際上是整數!),類型爲BOOL
或返回此類型的值。強類型的C++可能會抱怨,如果將它們強制轉換爲語言標準中定義的布爾類型。爲了保持一致性,我在使用Windows API函數的所有調用中使用舊的標識符,以及在我編寫自己的所有方法中現在由標準定義的關鍵字true
和false
。
真的沒有理由不使用FALSE
,因爲它在windows.h
中定義。但是,正如其他人所說的那樣,您不應該自己在私有頭文件中定義它,因爲不能保證定義會隨着時間的推移保持不變。這可能會導致一些非常愚蠢的錯誤,這種類型有資格出現在Daily WTF上。
Mat's answer是100%正確的,既不是TRUE
或FALSE
是由C或C++標準定義的。但是,它們都是由Windows API嚴格定義的,並保證不會更改。使用它們不會產生真正的跨平臺,嚴格符合標準的C++代碼,但編寫Windows應用程序時很少擔心,因爲它們都不會調用windows.h
中的任何其他函數。
@cody:是的,我使用的是Window應用程序...所以我使用假和真..其與布爾類型的工作... – RidaSana 2011-04-14 13:16:57
@Cody :關於bool和BOOL的問題的第二部分呢? – RidaSana 2011-04-14 13:21:29
@小姐:我補充說,在我的答案更新。簡單地說,'bool'是C++標準中定義的布爾類型。它適用於小寫的'true'和'false'關鍵字。 'BOOL'是一個整數類型,由'windows.h'定義,設計用於處理大寫的'TRUE'和'FALSE'。容易記住,因爲這些情況與每個組匹配。 – 2011-04-14 13:23:01
FALSE
未在標準中定義。只有false
是。 true
和false
被稱爲「Boolean litterals」(並且是C++中的關鍵字)。
FALSE
有時被定義爲宏。你不能依賴它出現在符合標準的環境中,因爲它不是標準的一部分。
換句話說,下面的程序是有效C++
:
#include <iostream>
#define FALSE 1
int main()
{
bool a = false;
bool b = FALSE;
std::cout << a << " " << b << std::endl;
return 0;
}
,它將打印0 1
預期。以任何方式,FALSE
都不是特權符號。
但FALSE和假返回0 ..這意味着兩種類型都是bool ..右 – RidaSana 2011-04-14 13:07:42
不在標準C++中。可以定義「TRUE」和「FALSE」(通常作爲宏,有時也可以作爲enum的值),但是你不能依賴它。以Linux上的'GCC'爲例,'bool something = FALSE;'是編譯時錯誤,因爲未定義'FALSE'。當定義'FALSE'時,通常將其定義爲'0'或'false' - 但這不是您應該依賴的。依靠標準。 – Mat 2011-04-14 13:09:40
關於bool和BOOL的問題的第二部分呢? – RidaSana 2011-04-14 13:21:46
++,假預處理宏是一個內置在文字表示假值布爾類型(其他可能的值表示與該文字真)
FALSE是它的#define定義可能取決於平臺,但通常爲0
表示false和FALSE都是布爾類型... FALSE表示0,但false也應該爲0,因爲它的布爾類型.. ..is't – RidaSana 2011-04-14 13:05:14
false不計算爲0,但強制爲0(或者如果您願意,則轉換爲int,例如當int被隱式轉換爲浮點數時)。預處理器將FALSE重寫爲0。請注意,FALSE也可能由false定義,這取決於平臺。 – 2011-04-14 13:19:29
@Miss:不,'FALSE'可能是一個布爾類型,但通常它是一個整型。您可以將它用作布爾值,但它仍然是不可或缺的。例如,當涉及模板演繹和重載函數解析時,這非常重要。如果FALSE擴展爲0,'f(false)'和'f(FALSE)'可以調用兩個完全不同的函數。 – 2011-04-14 13:19:59
不要使用FALSE
。正如其他人所說的那樣,這是一個對0進行宏觀評估的結果。我聽說過有人離開公司並將(#define FALSE 1
)隨機放置在代碼庫中的故事。一個肯定的方式來肆虐。因爲它是C++標準的一部分,所以堅持使用false
。
好像很容易固定,如果你原來的定義包括'的#ifdef FALSE和#undef FALSE' – 2011-04-14 13:16:14
只要記住布爾真正意義上的真假。他們總是會是整數(0,1)。編譯器可能無法識別它,但它們將始終作爲整數存儲並通過CPU運行。調試器將顯示這一點。它是否處於上限並不重要,因爲它的實施或使用應該沒有什麼不同。如果你的編譯器有一些宏寫成既支持大小寫又支持真假,那麼很好,但它只是爲了滿足你的需求。就像所有其他類型一樣。
有關Windows API的重要說明:儘管返回類型定義爲BOOL
,但某些WIndows庫函數會返回任意整數值。最好不要將BOOL
與TRUE
進行比較。使用
bSomeVal != FALSE instead.
這是在Windows下嗎?然後它是從C時間剩餘的時間,它沒有真正的布爾值,並且FALSE被定義爲0. – RedX 2011-04-14 12:59:34
@RedX:你的意思是FALSE由布爾值定義,那麼假? – RidaSana 2011-04-14 13:00:58
不,'FALSE'是這樣定義的:'#define FALSE(0)' – 2011-04-14 13:33:59