2014-02-28 36 views
6

是什麼兩者的區別:if(NULL == pointer)vs if(pointer == NULL)有什麼區別?

if (NULL == pointer) 

和使用:

if (pointer == NULL)  

我的教授說使用前者優於後者,但我看不出兩者的區別。

+2

沒有區別。 – Brian

+2

你需要做出標準的新手錯誤,並使用=而不是== –

+4

前者是醜陋的,令人討厭的,並且由體面的工具完全不需要。 –

回答

13

沒有什麼區別,它叫Yoda conditions也見"Yoda Conditions", "Pokémon Exception Handling" and other programming classics

在比較中,它應該防止錯誤地使用賦值(=),但現代編譯器現在應該警告這個問題,所以不需要這種類型的防禦性編程。例如:

if(pointer = NULL) 

將分配給NULLpointer什麼程序員心裏想的是:

if(pointer == NULL) 

它應該是一個比較,哎呀呀。使此使用尤達條件你會(see it live)錯誤,則相同的消息給本:

error: expression is not assignable

正如羅所指出的使用:

if (!pointer) 

避免了這個問題都聚集在這個案例。

這就是爲什麼與現代的編譯器,我們不需要這種技術了(see it live)一個具體的例子:

#include <iostream> 

int main() 
{ 
    int *ptr1 = NULL ; 

    if(ptr1 = NULL) 
    { 
      std::cout << "It is NULL" << std::endl ; 
    } 

} 

注意所有的警告:

warning: using the result of an assignment as a condition without parentheses [-Wparentheses] 
    if(ptr1 = NULL) 
     ~~~~~^~~~~~ 

note: place parentheses around the assignment to silence this warning 
    if(ptr1 = NULL) 
      ^
     (  ) 

use '==' to turn this assignment into an equality comparison 
    if(ptr1 = NULL) 
      ^
      == 

這使得很難錯過這個問題。值得注意的是,在C++nullptr應該優於NULL,你可以看看What are the advantages of using nullptr?的所有細節。

請注意,在C++有一個不太可能的情況與運營商重載,可能有一些人爲的情況下,他們是不一樣的。

注意,在某些方面-Wparentheses warning強制款式選擇,您可能需要放棄分配的潛在有效利用在產生警告的地方,例如,如果您使用-Werror還是選擇圓括號的情況下,其中一些可能會發現醜陋如下面的評論所示。我們可以使用-Wno-parentheses來打開gccclang中的警告,但我不會推薦這種選擇,因爲警告通常會顯示一個真正的錯誤。

+3

+1因爲我教你的尤達條件。 – LSerni

+0

這些「現代」警告通常是虛假的,例如, '如果(n = scanf(「%d%d」,&x,&y))'可能在代碼正確且按預期工作時觸發警告。所以程序員必須禁用警告,或者uglify代碼。就我個人而言,我發現多餘的'(....)!= 0'比尤達條件更難看。 –

+1

@MattMcNabb現代編程充滿了艱難的選擇,有時你必須在保留一個可以捕捉真正的錯誤的警告和對你的代碼風格稍作修改之間進行選擇。我不能告訴你要做出什麼選擇,因爲這通常是團隊的選擇。在大多數情況下,我會親自選擇將任務轉移出去,但我確信在某些情況下可以爲此提出爭論。 –

6

編譯器沒有什麼區別。唯一的優點是,如果你忘記了一個「=」,第一個表單會導致語法錯誤(你不能指定NULL),而第二個表單可能不會給出警告並且很高興地指出你的指針。

4

他們都是相同的(它們都檢查指針0),所不同的是,如果你想防止意外作業中,你通常會使用第一個例子:

if (pointer = NULL) // This compiles, but probably not what you meant 

if (NULL = pointer) // Syntax error! 
2

如果這門課程正在推銷爲C++ 11兼容,那麼真正應該使用的不是已經永遠存在的NULL宏檢查(至少在C語言生存期中)。應該比較的是nullptr類型。供參考:nullptrWhat exactly is nullptr?

從cplusplus.com頁以上引用,如2014年2月28日:

Null pointer type (C++) Type of the null pointer constant nullptr.

This type can only take one value: nullptr, which when converted to a pointer type takes the proper null pointer value.

Even though nullptr_t it is not a keyword, it identifies a distinct fundamental type: the type of nullptr. As such, it participates in overload resolution as a different type.

This type is only defined for C++ (since C++11).

(基於鐺
在C++ 11(鐺++,C++生成器64位短的樣品++ ),Visual Studio 2010和更新;也許只有64位的也一樣,GCC 4.7.3也許,不知道,可能是GCC 4.8,...):

if (pointer == nullptr) 

// this looks odd, but does compile 
if (nullptr == pointer) 

如果這是一個嚴格的C11當然,再它看起來像沒有改進的方式來替換NULL宏。 C99標準規定,NULL宏可以可移植地表示爲隱式或顯式轉換爲void *類型(from Wikipedia: Null pointer)的整數值零。就我所知,C11標準沒有修改C99標準的這一方面。

+1

社區的共識是,通常[cppreference應優於cplusplus.com](http://meta.stackexchange.com/questions/194788/links-being-changed-to-cppreference-com)。 –

0
String pointer = "Some value"; 

最初的pointer值是"Some value",因此,如果你誤用 if(pointer = NULL)代替if(pointer == NULL),空值將被分配給pointer檢查;但在(NULL = pointer)的情況下,編譯器將永遠不會允許您將任何內容分配給NULL。因此請在條件語句中繼續使用NULL == pointer

相關問題