私が見る限り、cでブール値を使用する3つの方法があります
#define FALSE 0 ... #define TRUE !(FALSE)
私が逃した他の方法はありますか?さまざまな方法の長所と短所は何ですか?
最速は3番、2はもっと読みやすいと思います(ただし、ビット単位の否定はオーバーヘッドにわずかに追加されますが)、1はすべてのコンパイラと互換性がなく最も読みやすいです。
<stdbool.h>
システムが提供する場合。これは、bool
、false
、およびtrue
(_Bool
、0、および1)。詳細については、C99のセクション7.16を参照してください。
コードで直接0または1を使用します。
Cプログラマーにとって、これはtrueまたはfalseと同じくらい直感的です。
私は通常:
typedef enum {FALSE = 0, TRUE} boolean;
Stdbool.hで定義されたbool型では、bool型をサポートする新しいコンパイラから古いコンパイラにコードを移動する必要がある場合に問題が発生します。これは、古いバージョンの仕様に基づいたCコンパイラを使用して新しいアーキテクチャに移行するときに、組み込みプログラミング環境で発生する可能性があります。
要約すると、移植性が重要な場合はマクロに固執します。それ以外の場合は、他の人が推奨することを実行し、インタイプのブリットを使用します。
どちらを使用する場合でも、変数をFALSEまたはfalseと比較します。
歴史的に、cまたはc ++でanythingとtrue(1)を比較するのは悪い考えです。 falseのみがゼロ(0)であることが保証されています。 Trueはその他の値です。多くのコンパイラベンダーは、これらの定義をヘッダーのどこかに持っています。
#define TRUE 1
#define FALSE 0
これにより、多くの人々が庭の道を進んでしまいました。 chartype以外の多くのライブラリ関数は、成功すると1以外の非ゼロ値を返します。同じ振る舞いをするレガシーコードがたくさんあります。
B99がc99 stdbool.hで定義されているかどうかをテストできます。
#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif
私は1に行きます。私はそれとの非互換性に遭遇しておらず、より自然です。しかし、私はそれがC標準ではなくC++の一部だと思います。 defineまたは3番目のオプションを使用したダーティーハッキングでは、パフォーマンスは向上しませんが、コードの維持に苦労するだけです。
私は(1)変数を定義するときが好きですが、式では真と偽と比較することはなく、if(flag)またはif(!flag)またはif(ptr)の暗黙のC定義を取ります。それが物事を行うCの方法です。
ゼロ以外のintはすべてtrueです。 falseはゼロです。このように、このようなコードは期待どおりに機能し続けます。
int done = 0; // `int` could be `bool` just as well
while (!done)
{
// ...
done = OS_SUCCESS_CODE == some_system_call ();
}
IMO、bool
は過大評価されたタイプであり、おそらく他の言語から持ち越されています。 int
はブール型として正常に機能します。
条件が真か偽かをテストする必要がある場合に特に役立つので、3番目のソリューション、つまり1と0を使用することをお勧めします。if引数に変数を使用するだけです。
他の方法を使用する場合、残りのコードと一貫性を保つために、次のようなテストを使用する必要があると思います。
if (variable == TRUE)
{
...
}
の代わりに:
if (variable)
{
...
}
1は最も読みやすく、すべてのコンパイラと互換性がありません。
ISO Cコンパイラには、bool
という組み込み型がありません。 ISO C99コンパイラの型は_Bool
、およびtypedefのbool
ヘッダー。そのため、互換性は、コンパイラがC99に準拠していない場合(たとえば、VC++)に独自のヘッダーを提供する場合にすぎません。
もちろん、より簡単なアプローチは、CコードをC++としてコンパイルすることです。
実際の速度差はありません。それらは、コンパイラーとまったく同じです。違いは、コードを使用して読み取ろうとしている人間との違いです。
私にとって、C++コードではbool、true、およびfalseが最良の選択です。 Cコードには、boolをサポートしないコンパイラーがいくつかあります(古いシステムで作業する必要があります)。
コードを読みやすくするため#defineを使用していました。また、プリプロセッサが#defineをコンパイルする前に#defineを数値に変換するため、数値(0,1)を使用する場合と比べてパフォーマンスが低下することはありません。コードが既にコンパイルされているため、アプリケーションが実行されると、プリプロセッサは再び邪魔になりません。
ところで:
#define FALSE 0
#define TRUE 1
そして、-1、-2、... 2、3などがすべてtrueと評価されることを忘れないでください。
使用したい
#define FALSE (0!=0)
#define TRUE (0==0)
または直接コードで
if (flag == (0==0)) { ... }
コンパイラがそれを処理します。私は多くの言語を使用していますが、FALSEが0であることを覚えておく必要があります。しかし、私がする必要がある場合、私は通常、その文字列ループについて考えます
do { ... } while (*ptr);
そして、それはFALSEが0であることを見るように私を導きます
特定の状況がわかりません。私がCプログラムを書いていたとき、私たちは常に#2を使用していました。
#define FALSE = 0
#define TRUE = !FALSE
それ以外の場合は、DOSまたはIntelベースのプロセッサに対するエイリアンプラットフォームの下で行われる可能性があります。しかし、私はグラフィックライブラリとグラフィカルIDEを記述するCとASMの両方を一緒に使用していました。私は Micheal Abrash の真のファンであり、テクスチャマッピングなどについて学ぶつもりでした。とにかく!それはここでの質問の主題ではありません!
このヘッダーファイルstdbool.hは当時存在しなかったため、これはCでブール値を定義するために最も一般的に使用される形式でした。