一 null值比较场景
对于C/C++或者java中对于null值的比较,有的时候直接使用if(!p)有的时候使用if(p == null),可能有的编程规范中要求null值在前面if(null == p),那么我们日常使用中该如何使用呢? 有没有一个统一的标准。
C语言中对null的比较,以linux kernel中的代码为例,使用的是if( p == NULL) 判断
static inline int nf_bridge_get_physinif(const struct sk_buff *skb)
{
struct nf_bridge_info *nf_bridge;
if (skb->nf_bridge == NULL)
return 0;
C++中对null指针的比较,以android中c++的工程代码为例,if(!p)和 if( p == nullptr) 都有使用,这里有一点要指出的是,c++使用的是nullptr而不是NULL
Return<Result> Health::update() {
if (!healthd_mode_ops || !healthd_mode_ops->battery_update) {
LOG(WARNING) << "health@2.0: update: not initialized. "
<< "update() should not be called in charger / recovery.";
return Result::UNKNOWN;
}
Return<void> Health::debug(const hidl_handle& handle, const hidl_vec<hidl_string>&) {
if (handle != nullptr && handle->numFds >= 1) {
int fd = handle->data[0];
battery_monitor_->dumpState(fd);
Java语言中null的比较,也是if (obj != null)的方式:
@Override
public ArrayList<View> buildTouchDispatchChildList() {
mTouchDispatchList.ensureCapacity(3);
if (mCaption != null) {
mTouchDispatchList.add(mCaption);
}
if (mContent != null) {
mTouchDispatchList.add(mContent);
}
return mTouchDispatchList;
}
二 分析
在C语言中关于NULL的定义
define NULL ((void*)0)
在C++语言中空指针使用的是nullptr而不是NULL,是因为NULL在C++中被定义成0,而nullptr才是给指针使用的。
#define NULL 0
由于JAVA中,除了立即数,其他都是对象,因此使用if(obj == null)进行比较。
可能每个公司的编程规范要求null值在前,避免赋值操作,相关bug不好查找,对于java来说这方面不用考虑,因为
if (o = null)
上面这种压根就编译不过,因为if判断的是boolean类型,唯一需要考虑的是下面这种情况
int m1(boolean x)
{
if (x = true) // oops, assignment instead of equality
像上面这种的话,直接判断x值即可
三 总结
1 对于java语言,除非编程规范限制,使用if (obj == null)判断即可,没有风险
2 由于C语言没有boolean类型,因此对于空指针判断使用if(!p)比较好一点。如果使用NULL的话,编程规范有特殊要求的话,比如要在左边if(NULL == p)那就按照编程规范书写。
网友评论