样式问题!条件再次条件== NULL

时间:2010-11-28 20:46:55

标签: c coding-style

如果调用某个函数,并且该函数在出现错误时返回NULL(例如,考虑malloc()fopen()),那么哪两个更好:

FILE *fp = fopen(argv[0], "r");

if (fp == NULL) {
    // handle error
}

if (!fp) {
    // handle error
}

这只是风格问题吗?我认为第一个更明确更明确,但后来我很少在C中编码: - )。

6 个答案:

答案 0 :(得分:7)

我认为这是一种风格问题。就个人而言,我更喜欢第二种选择。其他人喜欢第一个,因为它更清晰,更“适当”。有些人甚至会写if (NULL == fp),因此他们永远不会忘记忘记一个=并将其转换为作业。总而言之,我认为这是一个品味问题,而且可能更为重要的是保持一致。

答案 1 :(得分:7)

我更喜欢与NULL进行比较,因为它清楚地表明比较的两个操作数都应该是指针。此

(!p)的

或者

(p == 0)

要求您一目了然地了解p的类型(整数?布尔值?)。我认为所有的编码都应该假设你必须在早上4点(早上4点钟,那里因为那里的不眠之夜)调试这个东西9个月后。在这种情况下,每一点点都有帮助。

哦,最好在测试相等性时将常量作为第一个操作数放置,这样如果你不小心将它转换为赋值,编译器就会中止错误。

答案 2 :(得分:3)

在这种情况下,我更喜欢第一个,因为你明确地比较了值,看它是否为null(恰好是0)。

第二个读取好像fp是布尔值,而不是布尔值。

就像说“这个指针无效吗?” vs“这个指针是假的吗?”

哪一个对更具可读性当然是一个意见问题。

答案 3 :(得分:2)

我更喜欢“==”;我认为读者必须少思考。这也是我讨厌typedef的原因。

答案 4 :(得分:1)

  

这只是风格问题吗?

在C的情况下,这只是风格问题,因为两者都是正确的,但总的来说,我相信更多的人(包括我)更喜欢明确的比较(ptr == NULL),如下所示:

  • C ++ 0x引入了一个nullptr关键字来强调它不仅仅是一个数字或布尔值。
  • Java强制进行显式比较(obj == null),但不允许!obj

答案 5 :(得分:0)

是的,这是风格问题。 fp == NULL (哎呀,我写了fp = NULL ...)非常明确和明确,因为它表达了,对那些不熟悉所有C曲折的人来说都是好的。 Altough !fp非常像一个成语和双关语:“有(!)hing at fp”。蚂蚁它很短。为此,我喜欢!fp。我认为C设计师也喜欢这样,否则他们不应该为指针定义!。 :)