2011-07-26 50 views
10

可能重複:
What is the difference between these (bCondition == NULL) and (NULL==bCondition)?C++中NULL!= value的含義是什麼?

我正在經歷一段C++代碼,並遇到了類似的代碼

if (NULL != threadInfo) 
{ 
    ... 
    ... 
} 

我只是想知道有什麼區別在使用表達式之間

if (threadInfo != NULL) 
{ 
    ... 
    ... 
} 

上面說了什麼。 讀取第一個讀取「如果NULL不等於ThreadInfo」,第二個讀取「如果threadInfo不等於NULL」。對我來說,第二個更有意義。

+1

當您嘗試此操作時,您發現了哪些差異? – marto

+4

你會在c/C++中看到很多'if(Constant == variable)',因爲如果你離開second = off,試圖分配一個常量左手錶達式,你會得到一個編譯錯誤。也許類似的東西? – asawyer

+0

它沒有什麼區別,它只是一個等式,你應該更多地將它看作只有2個值('if(true == true)')而不是變量和值。 – Sander

回答

14

不,沒有區別。在==的情況下可能會有所不同。問題是,如果你不小心寫了=而不是==,編譯器會在第一種情況下給出錯誤。

if (threadInfo = NULL) //always false. The compiler will give you a warning at best 

if (NULL = threadInfo) //Compiler error 

我個人討厭這種做法,並認爲這是更好地編寫能夠在正常的人類語言,而不是尤達語言讀取的代碼。

+6

+1,絕對不可讀,絕對沒有任何收益。如果您經常輸入'='而不是'==',並且還有*什麼都沒有*以提醒您,那麼您可能會遇到更大的問題。 – rid

+1

該警告是無用的,因爲模板代碼會產生大量的誤報。 –

2

沒有區別。編寫NULL != ...的要點是,如果您改爲輸入錯字並編寫NULL = ...,代碼將無法編譯。如果你有... = NULL它可能是一個有效的任務和錯誤可能不被注意(但大多數編譯器檢測到這一點,並警告你)。有人曾試圖insert a backdoor into the Linux kernel using this technique

另請注意,大多數人不會這樣編碼。

0

這通常用作約定,本身沒有明顯的含義。

因爲分配發生在lvals上,並且NULL是不可分配的,所以當您的意思是threadInfo == NULLthreadInfo != NULL錯誤時,這可以防止可怕的threadInfo = NULL

有關更多詳細信息,請參閱this wikipedia article section on left-hand comparisons

2

沒有區別,只是第一個選項不能被誤輸入爲:

if (threadInfo = NULL) 
{ 
    ... 
    ... 
} 

而且有些人不知道如何使用編譯器開關檢查這個(和一些編譯器沒有它們)。

4

如果threadInfo是一種重寫operator !=的類型,並且該類的所有者尚未提供處理交換兩個參數的情況的對稱自由函數,則可能存在差異(可能還需要以解僱該程序員)。

否則,這是一個品味問題。可能會寫if(42 == answer)而不是if(answer == 42)的人會喜歡 - 這樣可以保護您免於錯誤地使用賦值運算符而不使用等號檢查。但是,由於現代編譯器在你這樣做的時候會提醒你,所以這個方法是否提供了什麼是值得商榷的。

+0

但區別在於'NULL!= threadInfo'不會編譯,因爲int沒有針對threadInfo類型的運算符!=。如果threadInfo是一個指針類型,我不認爲會有區別嗎? –

+0

@Douglas:可能有一個自由函數'operator!=(int,threadInfo_TYPE)'定義在與'threadInfo_TYPE'相同的名字空間中,在這種情況下,由於Koenig Lookup的原因它會被自動考慮。 – Jon

7

這是一種安全,所以你不小心寫的

threadInfo = NULL 

代替

threadInfo == NULL 

對於!=有沒有必要做這個,但它是一致的。

+5

轉。編譯器。警告。上。 :| – GManNickG

+1

我確實有我的編譯器警告。但是,我確實很喜歡知道背後的原因,而不是僅僅因爲其他人正在做這件事而做這件事。我只是說明了原因 - 這是一個有效的原因 - 我沒有說你不應該有警告...... –

0

兩者都做同樣的事情。這是一個風格約定用於避免輸入錯誤爲:

if (value=NULL) // assignment instead of == operator 
{ 
} 
1

沒有區別,這就是所謂的Yoda編碼約定。

if (NULL != threadInfo) 

相當於

if (threadInfo != NULL) 

if (threadInfo) 
0

這些是在邏輯上完全相等。

第二個更直觀,當看到第一個被認爲更安全,因爲它不允許錯誤地編寫(threadInfo = NULL),導致錯誤。

0

Null是內存中的引用,只包含任何內容,沒有任何地址可以訪問它。

通過這樣做,您可以在null後面進行比較以檢查某個對象是否有值或無值。

0

我沒有看到任何區別。但是,如果您忘記輸入第二個=,那麼編寫NULL == someVar的做法可以使您免於編寫NULL = someVar

相關問題