【问题标题】:if (!ptr) VS if (ptr == NULL) in C [duplicate]如果(!ptr)VS if(ptr == NULL)在C [重复]
【发布时间】:2018-02-10 14:25:41
【问题描述】:

有时我看到程序员使用:

void *ptr = <something>;
if (ptr == NULL)
    <do something>;

代替:

void *ptr = <something>;
if (!ptr)
    <do something>;

if (!ptr) 有什么问题吗,还是只是编码风格偏好?

【问题讨论】:

标签: c pointers


【解决方案1】:

在 C 中,这只是一种编码风格偏好。

有些人更喜欢if (NULL == ptr),其理由是如果程序员打错字(并将== 打错为单个 =)编译器会抱怨。但是,许多编译器会针对if (ptr=NULL) 发出警告(至少最近的GCC 会发出警告,当您应该调用gcc -Wall -Wextra 时)。


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


顺便说一句,一些奇怪的处理器可能有NULL 指针,它们不是全零位机器字(但编译器应该处理这个问题)。我无法说出今天广泛使用的任何此类处理器(但可以将 1980 年代分段的 16 位 x86 视为一个反例)。

【讨论】:

  • 也可以重新定义==,所以不清楚哪个更好。虽然如果你足够愚蠢地定义 a==0 != !a,那么你应该得到所有这些......
  • IIRC,分段 x86 具有不一定全位为零的空指针(由于使用段寄存器),编译器必须确保它们比较等于 0 。今天可能有一些 x86(特别是在相机和其他嵌入式控制器等设备中)。
  • 我想到了这一点,但我不会在今天广泛使用 16 位分段 x86。
  • 我以为佳能数码单反是 16 位 x86 的?也许我记错了。
  • 编译器将等效地编译两者。我不知道你说的NULL 总是零是什么意思。
猜你喜欢
  • 2020-04-28
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多