惯用法检查非零
当我想检查C中的值是否为0
时,它是如何惯用的?
-
if (!num)
-
if (num == 0)
虽然这是一个品味问题,但我发现这很大程度上取决于意图。 如果该值用作布尔值, !
没关系。 如果值正在计算某些东西,则平等更有意义。
if (!isVisible) {...} if (isVisible == 0) {...} // Intention not as clear as line above. if (numberOfItems == 0) {...} if (!numberOfItems) {...} // Intention not as clear as line above.
我总是喜欢第二种方式:
if (num == 0)
由于num == 0
或ptr == NULL
计算为一个boolean,它是intent。 Java编译器强制执行此表单,但C / C ++编译器没有。
最糟糕的例子是:
if (!strcmp(str, "something"))
由于strcmp
函数系列不返回布尔值,它真正伪装其意图,它们返回正,零或负(如@JoachimPileborg所指出的)。
但是,如果int
用于表示布尔类型,而C没有内置类型,那么这个表单就可以了:
if (!b)
但是这可以通过创建自定义类型进行自我记录:
typedef int bool; #define true 1 #define false 0 bool b = true; if (!b) { ... etc }
无论其他人告诉你什么,例外!
不要用float
和double
。 IEEE 754 float
s / double
s / long double
s(最常用)通常不包含精确值,因此直接将它们与0
进行比较是愚蠢的(或者if (!floatValue)
)
示例: http : //ideone.com/PIUflA
float f = 0.3; f -= 0.2; f -= 0.1; if (!f) { printf("zero\n"); } else { printf("non zero\n"); } if (f == 0) { printf("zero\n"); } else { printf("non zero\n"); }
使用未经优化的编译可以返回(在ideone上)
non zero non zero
(如果启用优化,编译器可以以更高的精度预先计算某些值并将它们舍入为0
)
我认为这取决于具体情况。 如果变量引用布尔值是更好的首选。 否则,第二个更好。
当然,对于编译器来说无关紧要。 对于人类读者而言。 由于这两种forms都被其他人使用,你应该习惯它们并认识它们。 就个人而言,我更喜欢最短的forms,这需要更少的时间(更少的代币,尤其是括号)来阅读和理解。 特别:
if (!ptr) {} if (!strcmp(a,b)) {}
比阅读更容易阅读
if (ptr != NULL) {} if (strcmp(a,b) == 0) {} of (0 == strcmp()) {}
最后一种forms让我身体不适。
根据你的风格,你想要完成它。 我认为只要你保持一致并明确你想要做什么,或者如果你在英语句子中流动得更好并且可能强调你的工作,那就不重要了。
为了清楚起见,我通常使用if (num == 0)
,因为当我查看代码时,理解我正在做什么的思路较少。
如果要检查值是否为非零, !!value
也会起作用。
!value
在值= 0时评估为1,在值≠0时评估为0。
第二个!
翻转它,使得!!value
在值≠0时评估为1,在值= 0时评估为0。
我们可能会争论哪种方式更好,但是惯用,尽管我可以通过其他答案来判断, if(!num)
。