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