惯用法检查非零

Pau*_*nta 5 c if-statement idioms

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

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

Dar*_*ust 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.
Run Code Online (Sandbox Code Playgroud)


tro*_*foe 6

我总是喜欢第二种方式:

if (num == 0)
Run Code Online (Sandbox Code Playgroud)

作为num == 0ptr == NULL评估为意图的布尔值.Java编译器强制执行此表单,但C/C++编译器不强制执行此表单.

最糟糕的例子是:

if (!strcmp(str, "something"))
Run Code Online (Sandbox Code Playgroud)

这实际上伪装了它的意图,因为strcmp函数族不返回布尔值,它们返回正数,零或负数(正如@JoachimPileborg所指出的那样).

但是,如果int用于表示布尔类型,而C没有内置类型,那么这个表单就可以了:

if (!b)
Run Code Online (Sandbox Code Playgroud)

但是这可以通过创建自定义类型进行自我记录:

typedef int bool;
#define true 1
#define false 0

bool b = true;
if (!b)
{
   ... etc
}
Run Code Online (Sandbox Code Playgroud)

  • 关于`strcmp`情况,除了零之外,返回值实际上可以是任何正值或负值.永远不要与"1"或"-1"进行比较. (2认同)