2009-06-16 107 views
1

我已經看到了這一點,但從來沒有聽清楚爲什麼......這真的適用於任何語言,不只是C#或VB.NET或Perl或其他。比較項目的順序?

比較兩個項目時,有時「檢查」值放在左側而不是右側。在邏輯上,我首先列出你的變量,然後列出你正在比較的值。但我看到了相反的情況,其中「常數」列在第一位。

這種方法有什麼(如果有的話)收益?

所以不是:

if (myValue > 0) 

我看到:

if (0 < myValue) 

if (Object.GimmeAnotherObject() != null) 

被替換爲:

if (null != Object.GimmeAnotherObject()) 

對此有何想法?

TIA! Kevin

+0

我認爲它是特定於C語言的,或者是語句中帶有賦值語句特定的 – Paco 2009-06-16 11:45:03

回答

8

一些開發商提上不斷離開,像這樣

if(0 = myValue) 

這是因爲你會從編譯器得到一個錯誤,因爲你不能分配值0。取而代之的是,你必須將其更改爲

if(0 == myValue) 

這可以防止出現痛苦的調試的道路,因爲打字

if(myValue = 0) 

是完全合法的,但最有可能你的意思

if(myValue == 0) 

第一選擇不是你想要的。它會巧妙地改變你的程序並導致各種頭痛。希望澄清!

+0

請記住,在許多較新的語言中,如果(myValue = 0)不是有效的代碼,因爲myValue = 0會計算一個數字,if ()不適用於一個數字作爲條件 – 2009-06-16 11:43:48

+0

@David歡迎來到僞代碼的世界:) – samoz 2009-06-16 11:44:28

2

我不認爲像一個簡單的規則,但恆定的第一或最後不變是不是一個非常聰明的選擇。我相信支票應該表達它的語義。例如,我更喜歡在範圍檢查中使用這兩個版本。

if ((low <= value) && (value <= high)) 
{ 
    DoStuff(value); 
} 

但我同意你提到的例子 - 我會但不變的最後,並且可以看到沒有任何理由以另一種方式做它。

if (object != null) 
{ 
    DoStuff(object); 
} 
2

在C++中這兩種都是有效的,並編譯

if(x == 1) 

if(x=1) 

,但如果你把它寫這樣

if(1==x) 

if(1=x) 

然後分配給1被捕獲並且代碼不會被編譯。

把const變量放在左邊是比較安全的。

一旦你進入把const的變量在左邊的賦值它往往成爲操作的默認模式的習慣,這就是爲什麼你看到它顯示在平等的檢查,以及

1

它的編碼實踐例如,輸入'='等類型爲'='的拼寫錯誤。

如果左邊有一個CONSTANT,則編譯器會捕獲所有賦值運算符,因爲您無法將其分配給常量。

許多語言(特別是C)在編寫代碼時有很大的靈活性。同時,左邊的常量似乎是不尋常的話,你也可以計劃的任務和條件在一起,

if (var1 = (var2 & var3)) { /* do something */ } 

此代碼將獲得布爾結果爲var1也/ *做某事* /如果結果是真正。

相關的編碼習慣是避免編寫代碼,其中條件表達式具有分配內容;儘管編程語言允許這樣的事情。你不會遇到這樣的代碼很多,因爲在條件內的分配是不尋常的,所以典型的代碼沒有這樣的事情。

IBM DeveloperWorks網站上有一個很好的C語言編碼實踐文章,可能仍然與用該語言編寫的人相關。

2

對於.NET,這是無關緊要的,因爲編譯器不會讓你做出像條件的任務:

if(x=1) 

因爲(其他人說的)這是不好的做法(因爲它很容易錯過)。

一旦您不必擔心這個問題,首先將變量放在第一位,然後再將值放在第二位,但這是唯一的區別 - 雙方都需要進行評估。