如果调用某个函数,并且该函数在出现错误时返回NULL(例如,考虑malloc()
或fopen()
),那么哪两个更好:
FILE *fp = fopen(argv[0], "r");
if (fp == NULL) {
// handle error
}
或
if (!fp) {
// handle error
}
这只是风格问题吗?我认为第一个更明确更明确,但后来我很少在C中编码: - )。
答案 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
),如下所示:
nullptr
关键字来强调它不仅仅是一个数字或布尔值。obj == null
),但不允许!obj
。答案 5 :(得分:0)
是的,这是风格问题。 fp == NULL
(哎呀,我写了fp = NULL
...)非常明确和明确,因为它表达了,对那些不熟悉所有C曲折的人来说都是好的。 Altough !fp
非常像一个成语和双关语:“有不(!)hing at fp”。蚂蚁它很短。为此,我喜欢!fp
。我认为C设计师也喜欢这样,否则他们不应该为指针定义!
。 :)