C ++でブール値を使用する必要があるのはいつですか?


34

私たちは、三目並べゲームを作成しなければならないクラスに割り当てられました。人々は自分自身を複雑にするのが好きなので、メニューを含む複雑なゲームを書きました。ゲームの最後に、もう一度プレイするか、プログラムを終了するかを選択する必要がありました。そのためにint変数を使用しましたが、クラスメートがBOOLを使用していることに気付きました。

より効率的ですか?intboolに保存するのではなく、2つの値のみを保存する回答を保存することの違いは何ですか?これらの変数の正確な目的は何ですか?


32
効率についてはわかりませんが、anの目的はint整数を格納することであり、aの目的はboolブール値(trueまたはfalse)を格納することです。boolIMO を使用すると、IMOを使用するよりもはるかに使いやすくなりintます。
ジョージデュケット

12
実際、C ++およびC99以前は、C89にはブール型がありませんでした。プログラマーはtypedef int Bool、ブール値を使用していることを明確にするために頻繁に使用します。C ++ boolは(ややい)_Boolキーワードを使用したC99と同様に、言語のサポートを統合しました。
チャールズサルビア

「いつ使用するかを知る」ことではなくbool、類似の型(などlength_t)に異なる名前を付ける理由と、コンパイラが型をチェックすることが重要である理由です。
アビックス

時々、答えは単に「味」です。現時点で同じ割り当てを書き換えると、関数パラメーターの順序や名前など、いくつかの違いが生じると思います。なぜ同じパラメーター順序または同じ名前を書いていないのですか?そのあなただけdidntのか、非常に重要ではなかった、あなただけの何でも書きましたので

回答:


82

変数のタイプと変数名を選択するときは、意図をできるだけ明確にする必要があります。bool(ブール型)を選択した場合、許容される値は2つだけであることは明らかです:trueまたはfalse。あなたが使用している場合はint(整数)タイプを、その変数の意図はわずか1か0か何あなたが意味することにした値であることをもはや明らかではないtruefalsesizeof(int)通常、Plus は4バイトとして返され、sizeof(bool)1を返します。


7
同意した。設計意図がより重要だと思います。それらをオーバーライドする必要があるのはたまにだけです。
ChrisF

9
@AndrewFinnelの要点を言い換えると、Boolはより自己文書化されています。0または1に設定した変数はカウンターになる可能性があります。trueまたはfalseに設定した変数は明らかにフラグです。
スコットCウィルソン

2
ブールは、他の用途での変数の悪用を防ぎます。整数を0または1以外の値に設定して、コードが認識できない追加の状態を作成できます。
マイケルショップシン

+1。意図/オプションが明確になります。任意の方法を使用して、値を「yes」または「no」の文字列を含めて保存できますが、最も意味のあるものを選択する必要があります。この場合、それはブール値です。
クレイジュ

C ++のブール値はintと同じサイズ、4バイトだと思いました。
DogDog

53

OPがそうではBOOLないことを語ったという事実を誰も捕まえなかったすべての(今まで)収集された回答のようboolです。

質問にはC ++のタグが付けられているため、次のことに注意する必要があります。

  • intはからINT_MINまでの範囲の整数です。INT_MAXマクロ<climits>は、ホストマシンのアーキテクチャに応じて値が異なります。C ++では、これらの値はそれぞれstd::numeric_limits<int>::min()およびとしてアクセス可能...:max()です。ブール演算子の動作は、falseとしてint処理さ0れ、その他はすべてtrueとして処理されます
  • BOOLintのブール動作を示唆する単なるヒントです。次のように定義され<cstddef>ます

    #define BOOL int
    #define TRUE 1
    #define FALSE 0
  • BOOLというのは、構文上の砂糖にすぎません。コンパイラにとっては、intにすぎません。これはCプログラマが使用するものですが、C ++にはがあるため、C ++プログラマは避ける必要がありboolます。

  • boolは、サポートされる値がjust trueおよびである言語整数型ですfalse。に変換するint trueと1にfalseなり、0になります。

重要な側面は、プログラミングミスに対してより安全であることです:

BOOL a = FALSE;  // in fact int a = 0;
a = 5; //now a == 5 -- what does it mean?;

適切なブール型でコーディングすることは不可能です。

bool a = false;
a = 5; // error: no bool(const int&) available.

BOOL代わりに使用することはbool、輝かしい過去から受け継がれた悪い習慣であり、誰も実際にはまだ忘れることができません。

語学教師は真剣に考えるべきです!


9
BOOLはC ++やC言語の一部ではありません。大文字のBOOLは、Cにブール型がなかった昔にCでブールが実装された最も一般的な方法です。たとえば、Windows APIはBOOLを定義します。さらに、BOOLがどのように定義されているかはわかりません。一部のアプリケーションでは、BOOLを1ビット長のビットフィールドとして定義する場合があります。特定のライブラリがそのように定義しているという理由だけで、常にintに等しいと仮定することはできません。

1
+1。おそらく彼は実際にブールではなくブールを意味していました。おそらくBOOLはさまざまな方法で実装できる可能性がありますが、Codereviewはこの種の質問をしていることを知らない可能性があります。彼は、それがintとして定義されていることを理解しているので、自然に単にintを使用できない理由を尋ねます。
ニール

1
@Lundin:一般的な意味ではあなたは正しいですが、これはOPがBOOLとint等価について話した質問の範囲内にある答えだと考えてください。
エミリオガラヴァリア

それでも、BOOLまたはboolを使用して意図を表すという考え方は引き続き適用されます。
アンドリューTフィネル

1
@zvrba:true。ただし、これはMSが独自のコンパイラにboolを実装することを決定した方法によるものです。Intelプロセッサで動作するMSコンパイラでのみ有効です。Intelプラットフォームの場合、32ビットより短いすべての整数型には、入力または出力でマスキングが必要であることに注意してください。ただし、char []はまだ使用されており、必ずしもint []で置き換えられるとは限りません
エミリオガラヴァリア

6

Bool型はInt型よりも小さいため、メモリ内の使用領域が少なくなります。コンパイルしているシステムに応じて、Intは4〜8バイトになりますが、Boolは1バイトになります(このMSDN記事をご覧ください)。

これをKISSのいくつかの側面と優れたプログラム設計と組み合わせると、2つの値しか持たない変数を格納するためにブールを使用する方が良い理由が明らかになります。

2つの異なる値のうち1つだけを保存する必要があると確信しているのに、なぜ広範囲の値を保存できるオブジェクトで物事が複雑になるのでしょうか?

75を格納すると、intを使用するシステムで何が起こりますか?追加の条件を追加した場合

if (value >= 0 )
  return true;  //value is greater than 0, thus is true
else
  return false; //value is 0 or smaller than 0, thus is false

または

if (value == 0)
  return false;  //value is greater than 0, thus is true
else if (value == 1)
  return true; //value is 0 or smaller than 0, thus is false

その後、この状況について説明します。しかし、もしあなたがそうでないなら、あなたはそうではありません。

また、(intの値をどのように変更するかに応じて)バッファオーバーランが発生し、値が0またはintの下限(「ターゲットアーキテクチャに応じて、 -127〜-9,223,372,036,854,775,808の領域)コードはどうなりますか?

ただし、boolを使用した場合は、次のようなものを使用できます。

if(continueBool == true)
  return true;
else
  return false;

あるいは:

return (continueBool== true) ? true : false;

あるいは:

return continueBool;

コンパイラーによっては、Boolsを使用してマップされたtrue / false値を保管するコードで実行できる最適化がある場合があります。一方、マップされたtrue / false値を保存するために使用されるIntに対して実行できる最適化がない場合があります。

また、C ++(C、Assembly、およびFORTRANとともに)を使用して、非常に効率的で小さくて高速なコードを作成することも覚えておく必要があります。したがって、このインスタンスでBoolを使用することをお勧めします-特に変数、メモリ、キャッシュ、またはプロセッサ時間の使用についてマークされている場合。

同様の質問は、整数(値)をfloatに格納するのはなぜですか?答え:意味がないので、すべきではありません。

簡単な説明:教師/講師/講師/教授として、さまざまな価値タイプのサイズを(見逃した場合に)検討し、それらがソフトウェア開発で重要である理由を説明します。

それが出発点として役立つことを願っています(また、それが教訓的なものとして出会わないことを願っています)


4
if()賞の不必要な使用。return value >= 0;最初の例のために書いてください。
zvrba

OPの構文の理解レベルについてはわかりませんでした。時にはそれのやりがいは、より詳細な少しをすることが通常より- OPはそれが割り当てたと指摘している、特に以来
ジェイミー・テイラー

2
意見の相違はありませんが、intの代わりにboolを選択して3バイトを節約しても、ほとんどのプログラムに目立った違いは生じません。本当にパフォーマンスの問題が発生するまで、効率を心配しないでください!
ジェームズアンダーソン

@James:また、多くの場合、次の変数は別のboolまたはcharでない限り、おそらく4バイト境界に揃えられるため、3バイトを保存しません。
JeremyP

1

ここでの目的は、意図を明確にすることです。戻り値の型は、関数インターフェイスの一部でありbool、関数よりも関数に何を期待するかについて詳しく説明intします。

でも、BOOLより表現豊かであるintことは同じタイプそれ以上のショーで自分の意思だにもかかわらず、。

しかし、それらのどれも私がお勧めするものではありません:

enum class UiCmd {QUIT, START_GAME};

-1

プログラミングでは、実際の生活の一部をコードで表現したいと考えています。intとboolは同じことを行うことができますが、真面目な考え方は完全に異なります。boolを使用する場合、答えはyesまたはnotになります。それだけです、それが意図です。整数を使用すると、小数点なしで数量を表すことができます。そして、同じ精神で、doubleで同じことができるのに、なぜ整数を選択するのですか?問題をモデル化するときに整数が倍精度よりも理にかなっている場合は、intを選択できます。


1
これは6年ほど前に投稿された点を作り、ここでトップの答えで説明比べて大幅な提供の何もしていないようだ
ブヨ

-2

最終的には、整数をブール値に変換します:「if(i = 1)then another game」。この場合(i = 1)はtrueまたはfalseに変換されます:ブール値。


実行しているマシンと関連するコンパイラに大きく依存します。IBMメインフレームで「Y」または「N」の単一文字フラグがブールロジックを実装する最も効率的な方法であることを知って驚くかもしれません。
ジェームズアンダーソン

4
注目すべきは、if (i = 1)おそらく自分のコードに持つことは非常に間違っていることです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.