52

[この質問は関連していますが、これと同じではありません。]

特定の型の値をブール式として使用しようとすると、警告が表示されます。警告を抑制するのではなく、三項演算子 ( ?:) を使用して bool に変換することがあります。2 つの not 演算子 ( !!) を使用すると、同じことが行われるようです。

これが私が意味することです:

typedef long T;       // similar warning with void * or double
T t = 0;
bool b = t;           // performance warning: forcing 'long' value to 'bool'
b = t ? true : false; // ok
b = !!t;              // any different?

では、double-not テクニックは本当に同じことをするのでしょうか? 三元法より多かれ少なかれ安全ですか?この手法は、非整数型 ( withvoid *またはdoubleforなどT) でも同様に安全ですか?

!!tスタイルが良いかどうかは問いません。と意味的に異なるかどうかを尋ねていt ? true : falseます。

4

17 に答える 17

84

! の引数 operator と三項演算子の最初の引数は両方とも暗黙的に bool に変換されるため、 !! および ?: キャストの IMO ばかげた冗長な装飾です。に投票します

b = (t != 0);

暗黙の変換はありません。

于 2008-10-15T20:07:30.010 に答える
42

または、これを行うことができます:bool b = (t != 0)

于 2008-10-15T19:39:43.933 に答える
32

気をつけろ!

  • ブール値は、真実と虚偽に関するものです。
  • 整数はほぼ整数です。

これらは非常に異なる概念です。

  • 真偽は物事を決定することです。
  • 数字はものを数えることです。

これらの概念を橋渡しするときは、明示的に行う必要があります。私はディマのバージョンが一番好きです:

b = (t != 0);

そのコードは明確に言っています: 2 つの数値を比較し、真偽値をブール値に格納します。

于 2008-10-15T20:35:59.780 に答える
6

私は使用しません:

bool b = !!t;

これは最も読みにくい方法です (したがって、維持するのが最も困難です)。

他は状況によります。
bool 式のみで使用するように変換する場合。

bool b = t ? true : false;
if (b)
{
    doSomething();
}

次に、言語に任せます。

if (t)
{
    doSomething();
}

実際にブール値を格納している場合。それから最初に、キャストが必要な最初の場所になぜ長いのか疑問に思います。long 値と bool 値が必要であると仮定すると、状況に応じて次のすべてを検討します。

bool  b = t ? true : false;      // Short and too the point.
                                 // But not everybody groks this especially beginners.
bool  b = (t != 0);              // Gives the exact meaning of what you want to do.
bool  b = static_cast<bool>(t);  // Implies that t has no semantic meaning
                                 // except as a bool in this context.

まとめ: 現在の状況に最も意味のあるものを使用してください。
自分が何をしているのかを明確にするようにしてください。

于 2008-10-15T20:10:42.623 に答える
6

すべての有効な手法は、すべて同じコードを生成します。

個人的には、最もクリーンな構文を使用できるように、警告を無効にするだけです。bool へのキャストは、私が誤って行うことを心配するものではありません。

于 2008-10-15T19:38:41.520 に答える
6


はい、安全です。


0 は偽として解釈され、それ以外はすべて真である
ため、!5 は偽として出力されます
!0 は真として出力される
ため、!!5 は真として出力されます

于 2008-10-15T19:41:20.437 に答える
3

その警告を抑制したり、ac キャスト (bool) を使用して抑制したりしないことをお勧めします。想定どおりに変換が常に呼び出されるとは限りません。

true に評価される式とその値のブール値には違いがあります。

両方 !!および三項は慣れるまではかかりますが、bool へのオーバーロードされたキャストを使用して内部型を定義したくない場合は、同様に機能します。

式の値を bool に割り当てるので、Dima のアプローチも問題ありません。

于 2008-10-15T19:45:54.843 に答える
2

警告が気になる場合は、キャストを強制することもできます。bool b = (bool)t;

于 2008-10-15T19:40:36.833 に答える
2

私は本当に嫌い!!t!!!!!!!!. これは、C と C++ の最悪の点、つまり、構文を巧妙に使いすぎたいという誘惑に似ています。

ブール b(t != 0); // 私見の最善の方法です。何が起こっているのかを明示的に示します。

于 2008-10-15T21:08:59.370 に答える
1

!! コンパクトかもしれませんが、不必要に複雑だと思います。私の意見では、警告を無効にするか、三項演算子を使用することをお勧めします。

于 2008-10-15T19:44:34.657 に答える
0

警告を無効にします。

最初に明確にするために書いてください。次にプロファイル; 次に、必要に応じて速度を最適化します。

于 2008-10-15T22:20:15.263 に答える
0

私は b = (0 != t) を使用します - 少なくとも正気な人なら誰でも簡単に読むことができます。コードにダブルダンが見られるとしたら、かなり驚かれることでしょう。

于 2008-10-15T19:50:22.947 に答える
0

!! ブール式を算術的に使用している場合にのみ役立ちます。たとえば、次のようになります。

c = 3 + !!extra; //3 or 4

(そのスタイルは別の議論です。) 必要なのがブール式だけの場合、 !! 冗長です。書き込み

bool b = !!extra;

次のように意味があります。

if (!!extra) { ... }
于 2008-10-15T23:58:14.240 に答える
-1

使用することをお勧めします

もし (x != 0)

また

もし (x != NULL)

if(x) の代わりに; より理解しやすく、読みやすくなっています。

于 2008-10-15T20:31:00.837 に答える
-2

double は私には面白くなく、デバッグコードでは最適化されたコードとは大きく異なります。

恋するなら!! いつでもマクロできます。

#define LONGTOBOOL(x) (!!(x))

(余談ですが、これらの場合は三項演算子が好まれます)

于 2008-10-15T19:45:53.407 に答える
-4

bool b = t を使用し、コンパイル警告をそのままにして、この特定の行の安全性についてコメントします。警告を無効にすると、コードの別の部分で問題が発生する可能性があります。

于 2008-10-15T20:25:00.943 に答える