是否有一个实用的理由使用"if(0 == p)"而不是"if(!p)"?

And*_*rey 21 c++ coding-style

我倾向于使用逻辑否定运算符编写if语句:

if (!p)
    some_code();
Run Code Online (Sandbox Code Playgroud)

我周围的一些人倾向于使用显式比较,因此代码看起来像:

if (FOO == p)
    some_code();
Run Code Online (Sandbox Code Playgroud)

其中FOO是一个,FALSE,0,0.0,NULL,等

我更喜欢简短形式,因为它是:

  • operator!= 友好
  • generic programming 友好
  • 简洁(对我来说更美丽)

什么是务实的(如果有的话),否则写这个的好处是什么?

Tro*_*our 23

为了对比@ Erik的答案,我会说!用于可读性.如果你发现你正在俯瞰它,那就试试你的眼睛吧.下一步是什么?避免1,使用3 - 2而不是?

  • 显然,如果你的读者忽略了`!p`中的`!`,唯一明智的做法就是写'!!! p`.多个惊叹号标记在互联网上工作,它们也可以在代码中工作. (26认同)
  • 大声笑!让我想起了一台机器,我们使用`PI/PI`代表"one"以提高存储效率,因为它比数字字符串"1"少. (3认同)

Eri*_*rik 13

使用(0 == p)(p == 0)可读性.这!是比较容易的第一眼,而不是忽视== 0

使用(0 == p),如果你有忽视编译器警告的习惯,想知道当您使用=,而不是==.

  • 我实际上发现`if(p)`和`if(!p)`比`if(p == 0)`,`if(p == 1)`或`if(p!= 0)更可读`. (4认同)
  • @Dan我发现如果p是bool类型,它更易读.否则我更喜欢将它转换为bool的检查.它几乎和使用!! p来测试类对象的真实性一样糟糕. (3认同)
  • @Erik:如果你有忽略警告的习惯,请打开`-Werror` (2认同)

cor*_*iKa 11

这取决于p代表什么.

如果p代表布尔/逻辑值,那么(!p)似乎最合适 - 通常不鼓励与"FALSE"进行比较.我不认为这有太大的争议.

如果p代表一个值,就像一个计数器,那么(p == 0)(0 == p)似乎是合适的.(两者之间通常存在激烈的争论.我发现第一个更具可读性,但第二个避免了一些非常严重的错误.)除了两个选项中哪一个更好,我不认为这是一个辩论(如在,它应该比较为0.)

如果p代表指针,那么你有一些问题.一个称职的C++程序员应该知道它(!p)会告诉你它是否为空.然而,这种可读性的想法是一个灰色地带,我认为这是一个备受争议的争论.


Kri*_*son 8

有人声称,实用的好处是,如果你明确地与NULL,FALSE,0等进行比较,程序员会发现它更容易理解,而逻辑运算符可能会让那些不理解隐式转换和布尔值如何工作的人感到困惑. C/C++.

(免责声明:我自己并不赞同这种观点.if (p) ...并且if (!p)...是用C和C++表达这种观点的惯用方法,而那些无法理解它们的程序员没有接触C或C++代码的业务.Heath Hunnicutt的评论已经过时了.)