Cおよびいくつかの同様の言語では、ブール式を等しいfalseかどうかを比較することtrueは危険な習慣です。
Cでは、スカラー式(数値またはポインター)をブールコンテキストで、たとえばifステートメントの条件として使用できます。Cルールは、if (cond)それと同等です。if (cond != 0)つまり、ゼロはfalseであり、ゼロ以外の値はすべて trueです。condがポインタ型の場合0、nullポインタ定数として扱われます。if (ptr)を意味しif (ptr != NULL)ます。
この意味は
if (cond)
そして
if (cond == true)
同じことを意味しないでください。がcondゼロ以外の場合、最初は真です。2番目はtrue、Cで(もしあれば#include <stdbool.h>)単純に等しい場合にのみ真です1。
たとえば、でisdigit()宣言された関数は、引数が数字の場合は値を<ctype.h>返し、数字でない場合はゼロ以外を返します。条件が真であることを示すために戻ることができます。比較は失敗します。int04242 == true
これ0は、偽と見なされる唯一の値であるため、等しいかどうかの比較falseが機能します。if (!cond)そして、if (cond == false)同じことを行います。しかし、あなたがそれを利用しようとするなら、比較することfalseは大丈夫であり、比較することtrueはそうでないことを思い出さなければなりません。さらに悪いことに、と比較することtrueはほとんどの場合機能します(たとえば、等値演算子と関係演算子は常にどちらか0またはを生成します1)。これは、これを使用して導入したバグを追跡するのが難しいことを意味します。(心配しないでください。重要なクライアントにコードをデモするとすぐに表示されます。)
C ++にはわずかに異なるルールがあります。たとえば、そのbool型は言語により密接に統合されており、typeにif (cond)変換さcondれboolます。しかし、効果は(ほとんど)同じです。
他の言語の中には、cond == trueand cond == false(または構文が何であれ)が安全であるような、より優れた振る舞いのブール値と呼ばれるものがあります。それでも、私が見たすべての言語にはnotor !演算子があります。そこにあるので、あなたもそれを使うかもしれません。使用するcond == falseのではなく、!condまたはnot cond、私の意見では、読みやすさを改善しません。(!キャラクターが一目で見るのが難しいことは事実です!。これを避けるために、後にスペースを追加することがあります。)
また、多くの場合、コードをわずかに再配置することにより、問題を回避し、明確性を向上させることができます。たとえば、次のように:
if (!cond) {
do_this();
}
else {
do_that();
}
あなたは書くかもしれません:
if (cond) {
do_that();
}
else {
do_this();
}
それは常に良いとは限りませんが、チャンスがある場所を探すのに害はありません。
概要: CおよびC ++では、等価比較にtrueとfalse危険である、過度に詳細な、と貧しいスタイル。他の多くの言語では、このような比較は危険ではないかもしれませんが、それでもまだ過度に冗長でスタイルが悪いです。