web-dev-qa-db-ja.com

falseとFALSEの違いは何ですか?

多くのプログラムで、識別子がFALSEおよびfalseのステートメントが表示されます。 C++のコンテキストでそれらの間に違いはありますか?

また、いくつかのプログラムでは、boolとどこかBOOLを見ました。これらの両方の違いは何ですか?

誰かがこれらの識別子の違いを私に説明できますか?ありがとう。

22
RidaSana

windows.hを含めた場合、FALSEは#0として定義されます。TRUEは#1として定義されます。それはnotブール型。整数型です。 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には標準で定義されたブール型がありませんでした。代わりに、開発者は独自のブール定数を定義することを余儀なくされました。発生する可能性のある混乱を防ぐために、MicrosoftはすべてのWindowsアプリケーションに使用される標準を決定しました。

Windowsアプリケーションを作成している場合でも、TRUEおよびFALSE識別子を使用する必要がある場合があります。 windows.hで定義されている関数のいくつかは、BOOLとして入力されたブールパラメータ(実際には整数!)を受け入れるか、そのような型の値を返します。強く型付けされているC++は、言語の標準で定義されているブール型にこれらを強制すると、文句を言う可能性があります。一貫性を保つために、Windows API関数のすべての呼び出しで古い識別子を使用し、自分で作成したすべてのメソッドで標準によって定義されたtrueおよびfalseキーワードを使用しています。

windows.hで定義されているため、FALSEを使用しない理由は実際にはありません。ただし、他の人が述べているように、独自のヘッダーファイルで自分で定義するべきではありません。定義が時間の経過とともに一定であるという保証はないからです。それは、DailyWTFに表示される資格のあるタイプのかなりばかげたバグを引き起こす可能性があります。

マットの答え は100%正解で、TRUEFALSEもCまたはC++標準で定義されていません。ただし、それらWindows APIによって厳密に定義されており、変更されないことが保証されています。それらを使用しても、真にクロスプラットフォームで厳密に標準に準拠したC++コードは生成されませんが、Windowsアプリを作成するときに問題になることはめったにありません。どちらも、windows.hの他の関数を呼び出すことはありません。

26
Cody Gray

FALSEは標準で定義されていません。 falseだけです。 truefalseは「ブールリテラル」と呼ばれ、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は、特権シンボルではありません。

14
Mat

c ++では、falseは、false値を表すブール型の組み込みリテラルです(他の可能な値は、リテラルtrueで表されます)

FALSEは#defineであり、その定義はプラットフォームによって異なりますが、通常は0です。

2

真と偽のブール値が常に意味することを覚えておいてください。それらは常に整数(0,1)になります。コンパイラはそれを認識しない場合がありますが、それらは常に整数としてCPUに格納され、実行されます。デバッガーがこれを表示します。実装や使用法に違いはないはずなので、大文字であるかどうかは実際には問題ではありません。コンパイラーに大文字と小文字の両方のtrueとfalseの両方をサポートするように記述されたマクロがある場合、それは素晴らしいことですが、それはあなたのニーズに合うだけです。他のすべてのタイプと同じように。

1
Hello

falseはC++キーワードです。

FALSEはC++標準では定義されていません。ただし、ほとんどのコンパイラでは、値が0のプリプロセッサマクロとしてFALSEが定義されています。

1
harper

Windows APIに関する重要な注意:戻り値の型はBOOLとして定義されていますが、一部のWINDOWSライブラリ関数は任意の整数値を返します。 BOOLTRUEと比較しないことをお勧めします。使用する

  bSomeVal != FALSE instead.
0
Dr DeeJay