web-dev-qa-db-ja.com

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

Tic-tac-toeゲームを作成する必要があるクラスの割り当てがありました。人々は複雑になりたいので、メニューを含む複雑なゲームを書きました。ゲームの最後に、もう一度プレイするか、プログラムを終了するかを選択する必要がありました。私はint変数を使用しましたが、BOOLを使用しているクラスメートがいることに気付きました。

より効率的ですか?ブール値ではなく2つの値をintに格納する必要がある回答を格納する場合の違いは何ですか?これらの変数の正確な目的は何ですか?

34
Bugster

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

82

(今までに)収集されたすべての回答で、OPがBOOLではなくboolについて話したという事実を誰も理解しなかったようです。

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

  • intは、_INT_MIN_〜_INT_MAX_の範囲の整数です。_<climits>_で定義されたマクロで、値はホスティングマシンのアーキテクチャに依存します。 C++では、これらの値はstd::numeric_limits<int>::min()および...:max()としてもアクセスできます)。 intに適用されるブール演算子の動作は、_0_をfalseとして扱い、その他すべてをtrueとして扱います。
  • BOOLは、intのブール動作を示すヒントにすぎません。 _<cstddef>_で次のように定義されています

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

  • boolは、サポートされている値がtruefalseのみである言語の整数型です。 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を使用することは、輝かしい過去から受け継がれた悪い習慣に過ぎず、誰も実際には忘れることができません。

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

53

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の領域 ターゲットアーキテクチャによって異なります )次に、コードで何が起こりますか?

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

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

あるいは:

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

あるいは:

return continueBool;

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

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

同様の質問は次のようになります:なぜ整数(値)を浮動小数点数に格納するのですか?回答:意味がないので、すべきではありません。

長い話:教師/家庭教師/講師/教授として、さまざまな値タイプのサイズについて(見逃した場合に備えて)、そしてそれらがソフトウェア開発においてなぜ重要であるかについて検討します。

私はそれが出発点として役立つことを願っています(私がそれが教訓的なものとして遭遇しないことも願っています)

7
Jamie Taylor

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

BOOLでもintよりも表現力が高くなりますが、少なくとも同じタイプであり、意図を示しています。

ただし、どれも私がお勧めするものではありません。

enum class UiCmd {QUIT, START_GAME};
1
kamikaze