2017-03-10 37 views
1

This OpenSSL的例子包含這樣的代碼:否定不等於NULL與否定不同?

const SSL_METHOD* method = SSLv23_method(); 
if(!(NULL != method)) handleFailure(); 

這是從以下不同的非空檢查?

if(!method) handleFailure(); 

,我可以看到他們的方式的唯一原因是,它可能是更接近語義:「它應該不空(NULL != method),但如果不是這樣(的!),然後我們應該處理失敗。「

+0

@ 2501所以我錯了。我取消。我記得像_it這樣的東西不必用全零位表示_ – LPs

+0

@LPs表示與值不同。 – 2501

+0

@LPs如果'NULL'保證爲零或者沒有,我記不起頭頂,但是如果不檢查空指針,''''操作符會做什麼? – Quentin

回答

2

NULL保證是空指針常量。不要與空指針混淆(理論上它可能具有非零表示形式)。空指針常量可以定義爲(void*)00

!(void*)0!0都給出了值1,所以任一版本都能保證工作。

但是,對指針操作數使用邏輯運算符被認爲是不好的做法。與NULL的明確比較使得程序員的意圖更加清晰 - 這是一種自我記錄代碼的形式,因此是一種很好的做法。

+0

@chux不,它可以明確地只是'(void *)0按照C11 6.3.2.3,'或'0'。它不能是別的。 – Lundin

+0

同意每個人好citaiton。 – chux

相關問題