惯用法检查非零

时间:2011-10-26 09:34:19

标签: c if-statement idioms

当我想检查C中的值是否为0时,它是如何惯用的?

  • if (!num)
  • if (num == 0)

8 个答案:

答案 0 :(得分:15)

虽然这是一个品味问题,但我发现这很大程度上取决于意图。如果该值将用作布尔值,!就可以了。如果值正在计算某些东西,则平等更有意义。

if (!isVisible) {...}
if (isVisible == 0) {...} // Intention not as clear as line above.

if (numberOfItems == 0) {...}
if (!numberOfItems) {...} // Intention not as clear as line above.

答案 1 :(得分:6)

我总是喜欢第二种方式:

if (num == 0)

num == 0ptr == NULL求值为布尔值时,它就是意图。 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
}

答案 2 :(得分:3)

无论其他人如何告诉你,除外!

请勿使用floatdouble执行此操作。 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

答案 3 :(得分:2)

我认为这取决于具体情况。如果变量引用布尔值是更好的首选。否则,第二个更好。

答案 4 :(得分:1)

对于编译器,当然没关系。对于人类读者而言。由于这两种形式都被其他人使用,你应该习惯它们并认识它们。就个人而言,我更喜欢最短的形式,这需要更少的时间(更少的代币,尤其是括号)来阅读和理解。特别是:

if (!ptr) {}
if (!strcmp(a,b)) {}

更容易阅读
if (ptr != NULL) {}
if (strcmp(a,b) == 0) {}
of (0 == strcmp()) {}

最后一种形式让我身体不适。

答案 5 :(得分:0)

根据你的风格,它已经完成了你想要它完成。只要你保持一致并明确你想要做什么,或者如果你在英语句子中流动得更好并且可能强调你的行为,那么我认为这不重要。

为了清楚起见,我通常有if (num == 0),因为当我查看代码时,理解我正在做的事情的思路较少。

答案 6 :(得分:0)

如果您想检查值是否为非零,

!!value也会起作用。

当值= 0时,

!value评估为1,当值≠0时,评估为0 第二个!翻转它,使!!value在值≠0时评估为1,在值= 0时评估为0.

答案 7 :(得分:0)

我们可能会争论哪种方式更好,但习惯性,尽管我可以通过其他答案陈述,if(!num)