if(pointer == NULL)和if(!pointer)有什么区别?这两个在IT技术中的含义是什么?

3
使用方式有什么区别:
if( pointer == NULL) 

并且,
if(!pointer)

我关注以下几点两者之间的差异:
1. 对于编译器来说,它们是否不同?如果是,那么具体有什么区别?
2. 在一般情况下,哪种编码风格更受推荐?为什么?
3. 请解释一下编译器如何“看到”NULL。

编辑:为了简单起见,让指针的类型为int *。


4
这完全取决于指针的类型。我们可以假设它类似于int *,而不是某个进行运算符重载的类吗? - nwp
2
pointer 是什么类型? - Peter Wood
3
关于第三点,NULL 是一个实现定义的宏。通常它的值要么是 0,要么是 nullptr。明确地使用 nullptr 通常被认为比使用 NULL 宏更好。 - 0x5453
1
如果“pointer”是一个已经重载了“operator!”和/或“operator==”的类型,那么它们可能非常不同,因为它们将调用不同的函数。 - Sean
优化编译器生成的代码可能是相同的。这实际上是一个风格和可读性的问题。C++11更倾向于使用nullptr而不是NULL - Basile Starynkevitch
显示剩余10条评论
3个回答

5
假设pointer是一个指针类型,if (pointer == NULL)已经过时且不是很好的C++写法,因为在C++中,空指针值是nullptr,其类型为nullptr_tif (!pointer)是更可取的写法。

5
有人认为隐式的 bool 转换很糟糕,而 pointer == nullptr 是更受欢迎的用法。我没有任何统计或民意调查可以支持我的观点被普遍接受的假设。 - nwp
7
[ES.87: 不要在条件语句中添加多余的 == 或 !=]不要在条件语句中使用多余的 == 或 != 操作符来进行比较,因为这些操作符已经隐含地包含在条件语句中了。这种做法会让代码更加冗长、难以理解,并且容易造成错误。 - Jonathan Wakely
另一方面,Misra-C++08的规则5-3-1指出:“!运算符、逻辑&&运算符或逻辑||运算符的每个操作数都应具有bool类型。”因此,if(!ptr)不符合该规则。 - Mike van Dyke

2
  1. 编译器是否会对它们进行区分?如果是,那么区别在哪里?

如果pointer确实具有指针类型,则对于编译器来说根本没有区别。

  1. 这两种编码风格中哪一种是推荐的通用风格,为什么?

可能会有建议采用其中一种。

使用!pointer的一个可能的优点是,没有机会将pointer = NULL打错字,这有非常不同的含义,但却是正确的。另一个优点是,它需要更少的输入。

  1. 您能否解释一下编译器如何“看到”NULL?

根据标准规定,NULL是一个实现定义的宏,它展开成一个空指针常量。


1
如果您误键 if (pointer = NULL),而且编译器没有警告您,请更改警告标志直到它发出警告。 - nwp
在那些编译器警告被实施之前,推荐使用 NULL == pointer - Oliv

1
  1. 它们都是与0进行比较的;只是一个明确。您可以通过查看生成的汇编代码来计算编译器的差异。

  2. 这是一个观点问题,因此不属于主题。

  3. NULL是应该等于0的宏。因此,在与指针进行比较时使用它被认为是不好的做法,因为nullptr具有隐式转换为指针类型,从而防止其与整数一起使用;而NULL没有这样的转换,因此可以与整数进行比较。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接