(p!= NULL)の代わりに(!! p)を使用する理由/タイミング
質問
次のコードで、(p!= NULL)
の代わりに(!! p)
を使用する利点は何ですか?
AClass *p = getInstanceOfAClass();
if( !!p )
// do something
else
// do something without having valid pointer
解決
これはスタイルの問題であり、実際には同等です。議論については、この非常によく似た質問を参照してください。
IMOとNULLポインターの比較がより明確になりました。
他のヒント
これはほとんど同じですが、 !! p
は悪いスタイルであると考えていますが、通常はコーダーが巧妙になろうとしていることを示しています。
GMan’の元のコメントが受け入れられるべきだと思います:
の何が問題なのかしら
if(p)
要点は、何もが間違っているということであり、この が望ましい方法です。まず、 !! p
は“ too clever&#8221 ;;です。それもまた完全に不必要であり、したがって悪いです(注意:ここで if
ステートメントのポインターについて話しているので、Anacrolix’コメントは一般的には有効ですが、そうではありません’ここに適用します!)。
p!= NULL
についても同様です。これは可能ですが、必要ありません。それはより多くのコードであり、完全に冗長のコードであるため、コードを悪化させます。ジェフ・アトウッドがこれまでに言った本当のことは、“最高のコードはコードがまったくないということでした”冗長な構文は避けてください。最小限にとどめます(完全な意味を伝えます; if(p)
is complete)。
最後に、 if(p)
はおそらくC ++でこれを記述する最も慣用的な方法です。 C ++は逆方向に曲がって、言語内の他のタイプ(データストリームなど)に対して同じ振る舞いを実現しますが、非常に奇妙な癖があります。標準の次のバージョンでは、ユーザー定義型でこの動作を実現するための新しい構文も導入しています。
ポインターについては、無料で同じものを取得します。それを使用します。
/ EDIT:明瞭さについて:sharptoothはそれを書きます
IMOとNULLポインターの比較がより明確になりました。
これは客観的に間違っていると主張しています: if(p)
の方が明確です。この文がC ++では、このコンテキストでも他の意味でも、他の何かを意味する可能性のある方法はありません。
私が見る限り、それはブール値に変換するより短い方法です。を適用します!ただし、 p!= NULL
は2回比較します。ですから、 !! p
の意味がわからない場合はよりわかりにくいですが、利点は短いコードだけだと思います。
これらは同じですが、使用することをお勧めします
NULL != p
読みやすくなりました。
指定された例に違いはありません。
ただし、これがすべての場合に当てはまるという仮定は誤りです。整数型に関する限り、 a = not b は a = b と同じではありません。
Cでは、 0
はfalseです。 0
以外はすべてtrueです。しかし、 not 0
は 1
であり、それ以外は何もありません。 C ++では、trueは整数として 1
にキャストされます。これは、Cとの後方互換性のためだけでなく、 1
が 0
ではなく、 1
は、など、Cブール型でtrueを示すために使用される最も一般的な値です。公式C bool型、およびWin32で使用される BOOL
指定されたサンプルコードでは、結果は if
条件の評価のために bool
にキャストされるため、 !! p
は不要です。 、ブール値を期待される整数値にキャストする目的での !!
の使用を除外していません。この例では、型の変更とセマンティクスが明確になる確率を最大化するために、 NULL!= p
または p!= NULL
を使用して、何であるかを完全に明確にします
この手法はダブルバンイディオムと呼ばれ、この男は正当な理由。
二重否定を使用しないでください。簡単な議論は、C ++は限られた英語のサブセットであり、英語には二重否定がないため、英語を話す人は何が起こっているかを解析するのが非常に難しいということです。