web-dev-qa-db-ja.com

Cでtrueとfalseを使用する

私が見る限り、cでブール値を使用する3つの方法があります

  1. bool型で、それ以降はtrueとfalseを使用します
  2. プリプロセッサを使用した定義#define FALSE 0 ... #define TRUE !(FALSE)
  3. 定数、つまり1と0を直接使用する場合

私が逃した他の方法はありますか?さまざまな方法の長所と短所は何ですか?

最速は3番、2はもっと読みやすいと思います(ただし、ビット単位の否定はオーバーヘッドにわずかに追加されますが)、1はすべてのコンパイラと互換性がなく最も読みやすいです。

57
Tom

<stdbool.h>システムが提供する場合。これは、boolfalse、およびtrue_Bool、0、および1)。詳細については、C99のセクション7.16を参照してください。

94

コードで直接0または1を使用します。

Cプログラマーにとって、これはtrueまたはfalseと同じくらい直感的です。

18
b.roth

私は通常:

typedef enum {FALSE = 0, TRUE} boolean;
15
Macarse

Stdbool.hで定義されたbool型では、bool型をサポートする新しいコンパイラから古いコンパイラにコードを移動する必要がある場合に問題が発生します。これは、古いバージョンの仕様に基づいたCコンパイラを使用して新しいアーキテクチャに移行するときに、組み込みプログラミング環境で発生する可能性があります。

要約すると、移植性が重要な場合はマクロに固執します。それ以外の場合は、他の人が推奨することを実行し、インタイプのブリットを使用します。

4
Doug T.

どちらを使用する場合でも、変数をFALSEまたはfalseと比較します。

歴史的に、cまたはc ++でanythingとtrue(1)を比較するのは悪い考えです。 falseのみがゼロ(0)であることが保証されています。 Trueはその他の値です。多くのコンパイラベンダーは、これらの定義をヘッダーのどこかに持っています。

#define TRUE 1
#define FALSE 0

これにより、多くの人々が庭の道を進んでしまいました。 chartype以外の多くのライブラリ関数は、成功すると1以外の非ゼロ値を返します。同じ振る舞いをするレガシーコードがたくさんあります。

4
Bob Wakefield

B99がc99 stdbool.hで定義されているかどうかをテストできます。

#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0
//typedef or define here
#endif
3
Nick Van Brunt

私は1に行きます。私はそれとの非互換性に遭遇しておらず、より自然です。しかし、私はそれがC標準ではなくC++の一部だと思います。 defineまたは3番目のオプションを使用したダーティーハッキングでは、パフォーマンスは向上しませんが、コードの維持に苦労するだけです。

2
anthares

私は(1)変数を定義するときが好きですが、式では真と偽と比較することはなく、if(flag)またはif(!flag)またはif(ptr)の暗黙のC定義を取ります。それが物事を行うCの方法です。

2
Lothar

ゼロ以外の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はブール型として正常に機能します。

2
wallyk

条件が真か偽かをテストする必要がある場合に特に役立つので、3番目のソリューション、つまり1と0を使用することをお勧めします。if引数に変数を使用するだけです。
他の方法を使用する場合、残りのコードと一貫性を保つために、次のようなテストを使用する必要があると思います。

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

の代わりに:

if (variable)
{
   ...
}
1

1は最も読みやすく、すべてのコンパイラと互換性がありません。

ISO Cコンパイラには、boolという組み込み型がありません。 ISO C99コンパイラの型は_Bool、およびtypedefのboolヘッダー。そのため、互換性は、コンパイラがC99に準拠していない場合(たとえば、VC++)に独自のヘッダーを提供する場合にすぎません。

もちろん、より簡単なアプローチは、CコードをC++としてコンパイルすることです。

1
Clifford

実際の速度差はありません。それらは、コンパイラーとまったく同じです。違いは、コードを使用して読み取ろうとしている人間との違いです。

私にとって、C++コードではbool、true、およびfalseが最良の選択です。 Cコードには、boolをサポートしないコンパイラーがいくつかあります(古いシステムで作業する必要があります)。

1
T.E.D.

コードを読みやすくするため#defineを使用していました。また、プリプロセッサが#defineをコンパイルする前に#defineを数値に変換するため、数値(0,1)を使用する場合と比べてパフォーマンスが低下することはありません。コードが既にコンパイルされているため、アプリケーションが実行されると、プリプロセッサは再び邪魔になりません。

ところで:

#define FALSE 0 
#define TRUE 1

そして、-1、-2、... 2、3などがすべてtrueと評価されることを忘れないでください。

0
Marco Demaio

使用したい

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

または直接コードで

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

コンパイラがそれを処理します。私は多くの言語を使用していますが、FALSEが0であることを覚えておく必要があります。しかし、私がする必要がある場合、私は通常、その文字列ループについて考えます

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

そして、それはFALSEが0であることを見るように私を導きます

0
debuti

特定の状況がわかりません。私がCプログラムを書いていたとき、私たちは常に#2を使用していました。

#define FALSE = 0
#define TRUE = !FALSE

それ以外の場合は、DOSまたはIntelベースのプロセッサに対するエイリアンプラットフォームの下で行われる可能性があります。しかし、私はグラフィックライブラリとグラフィカルIDEを記述するCとASMの両方を一緒に使用していました。私は Micheal Abrash の真のファンであり、テクスチャマッピングなどについて学ぶつもりでした。とにかく!それはここでの質問の主題ではありません!

このヘッダーファイルstdbool.hは当時存在しなかったため、これはCでブール値を定義するために最も一般的に使用される形式でした。

0