if(!ptr)VS if(ptr == NULL)在C中

Bit*_*tes 2 c pointers

有时我看到程序员使用:

void *ptr = <something>;
if (ptr == NULL)
    <do something>;
Run Code Online (Sandbox Code Playgroud)

代替:

void *ptr = <something>;
if (!ptr)
    <do something>;
Run Code Online (Sandbox Code Playgroud)

有什么可以出错if (!ptr),或者只是一种编码风格偏好?

Bas*_*tch 5

在C中,它只是一种编码风格偏好.

有些人喜欢if (NULL == ptr)用的说法是,如果程序员出现了拼写错误(和错误地输入了== 作为一个单一的 =),编译器会抱怨.但是,许多编译器会发出警告if (ptr=NULL)(至少是最近的GCC,当gcc -Wall -Wextra你应该调用时).


在C++中(您将使用nullptr而不是NULL),可能会有区别,因为可以重新定义operator !(例如,在智能指针上).但是,在原始普通指针(如void*或,sometype*SomeClass*)上,您无法重新定义像!或等运算符!=.


顺便说一句,一些奇怪的处理器可能有NULL指针,这些指针不是一个全零位机器字(但编译器应该处理这个问题).我不能说今天广泛使用的任何这样的处理器(但是考虑到80年代分段16位x86作为反例).

  • 人们也可以重新定义“==”,因此尚不清楚哪个更好。不过,如果你足够愚蠢地定义 `a==0` != `!a`,那么你应得的一切...... (3认同)