2016-05-05 3 views
0

は、我々は変数aを持っているとしましょう:"!" "== 0"のintseadはintが0の良い練習であるかどうかをチェックする?

は、それが代わりに

if(a == 0) 
{ 
    // do some stuff 
} 

if(!a) 
{ 
    // do some stuff 
} 

を行うには大丈夫ですか?それは働くので。

最初の例では、intはboolに変換されるため、static_cast<bool>(a)を指定しないでも問題ありませんか? aが1より大きい場合はどうなりますか?

+1

_ "いいえ、 ' if(!a) '" _確かめてください。 –

+3

技術的には、すべての条件節は 'if' /' while'/etcなどです。 'bool'は必要ありません。それらは整数値に変換可能でなければなりません。そして、値がゼロに等しいなら、それは偽として扱われ、そうでなければ真です。しかし、私は個人的には、読みやすさのために 'if(a == 0)'を好む。また、「良い実践」についての質問は、常に意見に基づいている。 –

+2

確かにそれはうまく動作し、標準によってよく定義されています - intからboolへの変換があり、0が偽であるとみなされ、非ゼロが真となる。しかし、あなたが読んでいる他の人間(将来自分自身を含む)のコードを書いていることを忘れないでください。 'if(a == 0)'を書くことは、より明示的な意図の記述です。経験豊富なプログラマーは 'if(!a)'を同じように正しく解釈しますが、この質問をしたという事実は、あなたのステートメントがあなたの上位レベルの意図を反映していないときにどのように問題になるかを強調します。 – Andrew

答えて

5

最初の例では、intはboolに変わりますので、static_cast<bool>(a)を付けないといいのですか?

はいいいです。暗黙的な変換が行われます。

また、aが1より大きい場合はどうなりますか?

0以外の値は暗黙的にtrueに変換されます。逆に値0のみがfalseとして扱われます。

あなたはどちらを選択する必要がありますか?いずれも問題ありません。私は自分のコードで自分の意図を表現するのが好きです。私はしたい場合aが0インクルードに等しいときのステートメントを実行する場合、私はそのよう

if (a == 0) 

は私がしたい正確に何を示していることを好みます。

+1

私は同意します。そして、どんな選択でも、一貫性を保ちます。 @blackは完全に – edmz

+0

です。構造体、字下げ、空白の一貫した使用はすべて非常に重要です。 – NathanOliver

0

これは有効であり、人々がそれを使用していますが、私はそれを良い習慣とは限りません。これは、値のセマンティクスについて間違った考えを示します。

0は、一般にfalsyと扱われますが、それは他の何よりもC日間からの遺物のほうが多いです。より新しい言語では、コードの読者がその価値を誤解してしまうため、それを許さない。

+0

_ "0は一般的に偽物だと扱われますが、それはC日からの遺物のほうが多い" _いいえ、0は偽であり、1はブール代数から来ているため真です。 – edmz

+3

いいえ、ブール代数は '0'と' 1'を知らず、 'true'と' false'しか知りません。'0'と' 1'はそれらの省略形の値として使われることがありますが、概念的には全く異なっています。 –

関連する問題