2009-10-26 131 views
11

比較運算符的順序有差異嗎?if(CONST ==變量)或if(變量== CONST)有什麼區別?

#define CONST_VALUE 5 

int variable; 

... 

if (variable == CONST_VALUE) // Method 1 
... 

OR 

if (CONST_VALUE == variable) // Method 2 
... 

這是簡單的偏好問題還是有一個特定的比較訂單令人信服的理由?

+0

請參閱http://stackoverflow.com/questions/283205/what-was-the-most-dangerous-programming-mistake-you-have-made-in-c/283212#283212 – 2009-10-26 19:45:25

+0

相關:[https:///en.wikipedia.org/wiki/Yoda_conditions](https://en.wikipedia.org/wiki/Yoda_conditions) – Boann 2013-11-26 19:12:03

回答

31

有些人使用方法2的原因是,如果您錯誤地輸入a =來代替==,那麼您會得到編譯器錯誤。然而,你會有人(像我一樣)仍然會使用方法1,因爲他們發現它更具可讀性,如果出現錯誤,它將在測試過程中被檢測到(或者在某些情況下,代碼)。

+11

告訴我,你有沒有犯過這樣的錯誤,以這種方式編寫它會陷入困境?我把它寫成「方法1」,因爲它更具可讀性,並且我敢肯定,在編寫C和C類語言的25年中,我從未*寫過=而不是==。 – 2009-10-26 18:48:24

+5

它發生在我身上。考慮你自己的幸運。 – 2009-10-26 18:50:24

+3

@ Paul Tomblin:多年來至少有三次,我已經在if(或while)語句中進行了一項任務,並且在進行比較的時候已經確定了長期存在的錯誤。也就是說,我還應該指出,如果某個編譯器(特別是gcc)包含* only *一個賦值(無比較),那麼它會/將發出警告,除非包含在一組額外的括號內。儘管如此,首先保證與所有編譯器一起工作。 – 2009-10-26 18:54:35

10

唯一的區別是,(CONST_VALUE ==變量)使得共用錯字(CONST_VALUE =可變)不可能進行編譯。

相比之下,如果(變量= CONST_VALUE)將導致編譯器想你的意思是分配給CONST_VALUE「變量」。

的=/==混亂是錯誤的在C很常見的來源,這就是爲什麼人們都試圖解決這個問題用編碼約定。

當然,如果您比較兩個變量,這並不會節省您的時間。

而且這個問題似乎是How to check for equals? (0 == i) or (i == 0)

重複,這裏的一些詳細信息:http://cwe.mitre.org/data/definitions/481.html

3

正如其他人所提到的,CONST_VALUE ==變量避免錯字=。

我還是做了「可變== CONST_VALUE」,因爲我覺得它更具可讀性,當我看到這樣的:

if(false == somevariable) 

我的血壓上升。

+3

我確實使用了'if(CONST_VALUE == variable )',但是如果我看到'if(false == somevariable)',我的血壓也會受到影響。 (這是因爲這當然應該是'if(!somevariable)'。) – sbi 2009-10-26 18:49:44

+1

+1 for pressurepressure – GManNickG 2009-10-26 18:56:54

2

的第一變型

if (variable == CONST_VALUE) 

是較好的,因爲它是更具有可讀性。它遵循變化最大的價值第一的約定(也用於數學)。

第二個變量

if (CONST_VALUE == variable) 

被一些人以防止平等與分配

if (CONST_VALUE = variable) 

有更好的方法來實現,例如啓用和採取謹慎檢查的mixup的編譯器警告。

1

其他人已經指出了原因。 =/==混亂。我更喜歡第一個版本,因爲它更接近思考過程。一些編譯器緩解混亂=和==給予警告,當它遇到類似

if(a=b) 

在這種情況下,如果你真正想做的事你不得不寫分配

if((a=b)) 

我會這樣寫

if((a=b) != 0) 

爲了避免混淆。

這就是說,我們在我們的代碼中有1個案例,其中我們有一個=/==混淆,反過來寫它不會有幫助,因爲它是增值稅之間的比較。

+0

在GCC中,該選項是-Wparentheses – Adisak 2009-10-27 01:37:13