C 用NULL否定不等式与否定不等式不同吗?
OpenSSL示例包含如下代码: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指针常量。不要与空指
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
。不可能是别的。