2012-10-23 46 views
-1

假設我有一個if語句的方法,像這樣:在if內執行代碼之前是否執行所有邏輯或分隔的檢查?

if (foo() || bar()) { 
    return true; 
} 

既能foo()bar()都完全評估是否只要有一個條件滿足,如果內執行的代碼,或前處理?

我詢問原因就是我的foo()bar()方法等價物是相當昂貴的計算功能,而如果單獨foo()滿足的條件,如果我不想執行bar()。因此,我當前的代碼是沿着線:

if (foo()) { 
    return true; 
} 
if (bar()) { 
    return true; 
} 

這是必要的,或將在邏輯或分離函數表現得像一個要求?

+0

解釋downvote的評論會很好 - 我的問題真的不清楚或沒有用嗎?我不知道短路,當然這個問題可能對其他人也沒有意識到的有用。 – Quetzalcoatl

回答

7

&&||短路在所有3種語言AFAIK,所以如果foo()計算結果爲truebar()不會被調用。

5.15邏輯OR運算符[expr.log.or]

1)||運營商組從左到右。操作數都被上下文轉換爲bool(條款4)。它的 如果它的任何一個操作數爲真則返回真,否則返回假。不像|||保證從左到右 評估;而且,如果第一個操作數的計算結果爲true,則不評估第二個操作數。 (強調我的)

+0

優秀的答案,短路是我以後的術語 - 是在我的舌頭,謝謝。 – Quetzalcoatl

1

如果其中任何一個都爲真,則不會進一步處理。這是電話Short Circuit Evaluation

如果foo()解析爲true,則下一個方法bar()將不會在if語句中執行。條件將解決爲真。

檢查|| Operator (C# Reference) - MSDN

操作

x || y 

對應於操作

x | y 

,只是如果x是真實的,Y不評估,因爲OR操作 是真實的不管y的價值如何。這個概念被稱爲 「短路」評估

1

我有點好奇,寫了一個小程序來確定應該發生什麼。

class Program 
    { 
     static void Main(string[] args) 
     { 

      if (foo() || bar()) 
      { 
       Console.WriteLine("Either Foo or Bar returned true"); 
      } 
      Console.ReadKey(); 
     } 
     public static bool foo() 
     { 
      Console.WriteLine("I am in Foo"); 
      return true; 
     } 
     public static bool bar() 
     { 
      Console.WriteLine("I am in Bar"); 
      return false; 
     } 

    } 

這只是返回

I am in Foo 
Either Foo or Bar returned true 

手段,如果第一次評估是真實的,也不會去第二次評估,它會從左到右。

-Immil

+0

僅供參考,測試並不總是奏效。 (作爲一個實驗,沒關係) –

相關問題