一 null值比較場景
對于C/C++或者java中對于null值的比較,有的時候直接使用if(!p)有的時候使用if(p == null)玻淑,可能有的編程規(guī)范中要求null值在前面if(null == p)搂妻,那么我們?nèi)粘J褂弥性撊绾问褂媚兀?有沒有一個統(tǒng)一的標準寝凌。
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中宰掉,除了立即數(shù),其他都是對象赁濒,因此使用if(obj == null)進行比較轨奄。
可能每個公司的編程規(guī)范要求null值在前,避免賦值操作拒炎,相關bug不好查找挪拟,對于java來說這方面不用考慮,因為
if (o = null)
上面這種壓根就編譯不過击你,因為if判斷的是boolean類型玉组,唯一需要考慮的是下面這種情況
int m1(boolean x)
{
if (x = true) // oops, assignment instead of equality
像上面這種的話,直接判斷x值即可
三 總結
1 對于java語言丁侄,除非編程規(guī)范限制惯雳,使用if (obj == null)判斷即可,沒有風險
2 由于C語言沒有boolean類型鸿摇,因此對于空指針判斷使用if(!p)比較好一點石景。如果使用NULL的話,編程規(guī)范有特殊要求的話拙吉,比如要在左邊if(NULL == p)那就按照編程規(guī)范書寫潮孽。