C 用NULL否定不等式与否定不等式不同吗?

C 用NULL否定不等式与否定不等式不同吗?,c,null,C,Null,OpenSSL示例包含如下代码: const SSL_METHOD* method = SSLv23_method(); if(!(NULL != method)) handleFailure(); 此not NULL检查是否与以下检查不同 if(!method) handleFailure(); 我能理解他们的方式的唯一原因是它可能更接近语义:“它不应该是NULL(NULL!=method),但如果不是这样(The!),那么我们应该处理失败。”NULL保证是一个NULL指针常量。不要与空指

OpenSSL示例包含如下代码:

const SSL_METHOD* method = SSLv23_method();
if(!(NULL != method)) handleFailure();
此not NULL检查是否与以下检查不同

if(!method) handleFailure();

我能理解他们的方式的唯一原因是它可能更接近语义:“它不应该是NULL(
NULL!=method
),但如果不是这样(The
),那么我们应该处理失败。”

NULL
保证是一个NULL指针常量。不要与空指针混淆(理论上可能有非零表示)。空指针常量可以定义为
(void*)0
0

!(void*)0
!0
两者都给出值
1
,因此任何一个版本都保证工作


但是,在指针操作数上使用逻辑运算符被认为是一种不好的做法。与
NULL
进行显式比较可以让程序员的意图更加清晰——这是一种自我记录代码的形式,因此是一种良好的实践。

@2501所以我错了。我取消。我记得它不必用全零来表示bits@LPs表示法与值不同。@如果
NULL
保证为零或不为零,我记不得了,但是
会是什么运算符不检查空指针吗?@2501是的,现在我知道了…;)我认为,你关于“更接近语义学”的假设接近事实。。。但是,行
if(NULL==cert)handleFailure()不遵循此范例。OTOH,OpenSSL并不是一个好的编码参考…@chux不,根据C116.3.2.3,它只能显式地是
(void*)0
0
。不可能是别的。