2015-12-14 9 views
6

unsigned intが厳密に正であると主張したいと思います。私は、次の2つのオプションの間で議論された:uintが厳密に正であるか

unsigned int i = 1; 
assert(i > 0); /*option 1*/ 
assert(i != 0); /*option 2*/ 

私はBuridan's assジレンマで自分がこだわりました。どちらか一方を好む理由がありますか?

+3

「符号なし整数」は、「0」にすることができます。 – birryree

+1

私は知っています。だから私は主張する必要があります。 –

+0

それはまだ0になることができます – ColdSteel

答えて

6

assert(i > 0);iは、正の整数がチェックされ、i = 0の場合も含めて、他のプログラマが読むことができます。


注:JoachimとしてマクロNDEBUG<assert.h>が最後に含まれていた瞬間に定義されている場合は、マクロassert()は何のコードを生成しない、ので、全く何もしないことを心に留めておくこと彼のcommentで指摘。

3

は、私は2つの理由のために

assert(i > 0); /*option 1*/ 

を好みます。

まずはキャラクターが1つ少なく、キャラクターにはお金がかかります。

第2に、数値が厳密に正であることを示すことが意図されている場合、これは、私が符号なし整数であることを知らなくても明らかになります。

+0

さて、あなたはそれが符号なしであることを知る必要があるでしょう、あなたは負の値をテストする必要がないことを知っています。 –

+1

数字が厳密に正であることを望むなら、数字が符号なしであるかどうかにかかわらず、オプション1では厳密に肯定的です。オプション2では厳密には肯定的ですが、コードを見るときに確認するために追加の情報が必要です。 –

2

どちらも、確かに全体的な機能の目標を伝えるものは何でも同じコードのでを生成し、より良い選択である:それは肯定的主張であるよう

unsigned int i = ...; 
assert(i > 0); /*option 1*/ 
assert(i != 0); /*option 2*/ 

オプション1は、ほとんどの場合にうまく機能:値は何をする必要があります何があってはならないのか対。通常、これは理解しやすいです。また、算術的性質がiの場合は、これが最善の方法です。

iが0またはゼロ以外の値のみで使用される場合、特に算術値が不適切な論理ビットの集合である場合、オプション2は限られたケースで良好に動作します。

関連する問題