2011-05-02 78 views
13

在探索msdn網站時,他們使用的大部分條件檢查位置(NULL == bCondition)。這些(bCondition == NULL)和(NULL == bCondition)之間有什麼區別?

使用這些符號的目的是什麼?

請提供一些樣本來解釋這些。

謝謝。

if (bCondition = NULL) // typo here 
{ 
// code never executes 
} 

if (NULL = bCondition) // error -> compiler complains 
{ 
// ... 
} 

C語言編譯器給出警告在前者:

+12

另一個問題很多,其中karthik/user692270接受@karthik的答案。停止這種虛假的upvote農業。 – 2011-09-27 07:24:05

回答

26

採用NULL == condition在一個錯字的情況下,當賦值運算符=被意外使用,而然後比較運算符==提供了更多的有用的行爲情況下,許多語言都沒有這樣的警告。

+0

他在說'='還是'=='? – 2011-05-02 07:04:45

+0

我覺得他問的是'=='? – Jess 2011-05-02 07:05:59

+1

@Jess:主要目的是,如果有人忘記放置賦值運算符而不是比較運算符,則會拋出error.thats爲什麼在msdn站點中他們正在使用像這樣的比較NULL == bCondition – karthik 2011-05-02 07:08:23

8

許多人更喜歡編寫NULL == bCondition,以便它們意外地不將NULL值分配給bCondition。

因爲錯字它發生的,而不是寫

bCondition == NULL 

他們寫出來

bCondition = NULL // the value will be assigned here. 

在案件

NULL = bCondition // there will be an error 
4

它只是一個很好的防禦措施。有些人也可能會發現閱讀起來更方便。如果拼寫錯誤,而不是相等運算符,編譯器會嘗試修改NULL,該值不是左值,將產生錯誤消息。當使用bCondition = NULL時,編譯器可能會產生一個關於使用賦值作爲真值的警告,該消息可能會丟失並且不被注意。

+0

也許你拼錯了術語'lvalue'和'rvalue'? – beduin 2011-05-02 07:08:54

+6

我們有些人認爲閱讀起來很不方便。至少這顯然會讓人們問爲什麼有人會這樣做! :-) – 2011-05-02 07:12:26

+0

@beduin:是的,謝謝你的注意。 – 2011-05-02 07:32:08

10

它叫做Yoda Conditions。 (original link,你需要高級代表才能看到它)。

這是爲了防止意外分配=在意向相等比較==的條件。如果你習慣性地堅持尤達,並通過編寫=而不是==來造成拼寫錯誤,則代碼將無法編譯,因爲您無法分配給右值。

它值得尷尬嗎?有人不同意,說當編譯器在條件表達式中看到=時會發出警告。我說,在我一生中只發生過兩三次這樣的錯誤,這並不能證明我改變了我在這次大會上寫的所有MLOC。

+1

+1太糟糕了,現在鏈接已經死了。 – Flavius 2012-02-22 04:21:59

+6

@Flavius:不完全死了,你只需要足夠的代表來看看它。我無法得到SO上的版主的趨勢來刪除所有內容。它至少可以遷移到程序員SE。 – ybungalobill 2012-02-22 08:52:00

+1

現在有一個[WiKi頁面](http://en.wikipedia.org/wiki/Yoda_conditions)WiKi頁面。 – 2014-07-17 14:08:03

8

沒有區別。這是一種古老的防守編程方式,已經過時20多年了。目的是在比較兩個值時防止意外鍵入=而不是==。遷移到C的Pascal程序員特別容易寫這個bug。

從1990年發佈的Borland Turbo C轉發,當你設法輸出這個bug時,每個已知的編譯器都會警告「可能不正確的賦值」。所以寫(NULL == bCondition)不是比相反的更好或更差的練習,除非你的編譯器是非常古老的。你不需要爲寫任何特定的順序而煩心。

什麼你應該打擾用,是適應一種編碼風格,你從未寫作業內如果/循環條件。沒有理由這樣做。這是C語言的一個完全多餘,風險和醜陋的特徵。所有行業事實上的編碼標準禁止在條件內分配。

參考文獻:

  • MISRA C:2004年13.1
  • CERT C EXP18-C
+0

MSVC至少在默認情況下不會警告您對這個錯誤。 – shebaw 2011-05-06 15:18:52

+2

@shebaw令人印象深刻的是,他們設法編譯出比1991年的TC差的編譯器。獲得一個新的編譯器。 – Lundin 2011-05-08 16:54:25

+2

+1爲最佳答案。我厭惡尤達風格。有很多更好的方法可以避免語言中的這個缺陷,而不是向後寫。 – 2011-07-26 13:39:05

1

雖然通常variable == valuevalue == variable沒有區別,而在原則上不該」在C++中,如果涉及操作符重載,那麼通常情況下可能會有所不同。例如,雖然==預計是對稱的,但有人可能會寫出一個不是的病理實現。

微軟的_bstr_t字符串類在其operator==實現中遇到了不對稱問題。

+0

有不對稱的有效案例。例如,當實現一個智能指針時,在原始指針作爲參數的類中使用==操作符是非常合理的。在這種情況下,恢復訂單將導致編譯錯誤。 – SomeWittyUsername 2016-07-22 08:19:00

相關問題