2010-10-22 37 views
3

我確定這個問題可能以前已經回答過,所以我很抱歉,但我無法找到正確的搜索條件來找到答案。編譯器是否繼續評估一個表達式,如果第一個表達式爲假,那麼所有表達式都必須爲真?

給出以下代碼示例,db.GetRecords().Any()是否被執行?

string s = "Z"; 
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 && 
     db.GetRecords().Any(); 
+0

你可以嘗試一些簡單的功能,你會得到你的答案。 – 2010-10-22 14:11:53

+0

@Gunner好點。我應該想到這一點。我想今天早上咖啡還不夠。 – 2010-10-22 14:15:20

回答

8

號兩者&&||short-circuit evaluation評價。這意味着如果a爲假,a && b返回false,並且a || b返回true,如果a爲真,並且在這兩種情況下都不會評估b

如果由於某種原因您不想進行短路評估,則可以使用按位運算符&|

+0

實際上是否有充分的理由使用單數和| ? – 2010-10-22 14:56:09

+1

@ eddy56&and |通常用於評估可以設置多個標誌的標誌。 – 2010-10-22 14:57:22

2

號的操作者&&短路(這意味着它停止計算表達式的任何部分後的表達式評估爲假)。

||運算符也會短路,但在表達式的任何部分評估爲true後會停止評估。

+0

'||'在檢測到錯誤的參數時不停止計算。 – jason 2010-10-22 14:14:22

+0

@Malfist:我不需要一個。你告訴我:'false || true'應該評估爲'false'? – jason 2010-10-22 14:17:42

+0

@Jason Wow。做了一個快速編輯,顯然沒有考慮我輸入的內容。回滾。 ...需要更多的咖啡。 – 2010-10-22 14:20:01

2

不,C#使用短路和。所以答案是no

如果您需要同時評估,請使用非短路操作符,只需使用一個和號&

tring s = "Z"; 
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 & 
     db.GetRecords().Any(); 

請注意單個&

1

據短路,並允許你做這樣的事情:

if(ob && ob.somefunc()) { ... } 

如果兩個進行了評價,就引用了null對象,這將是一個運行時異常的可能性。

+0

我認爲你的意思是'if(ob!= null && ..',因爲唯一可行的方法是ob是一個bool,而bools並沒有真正的方法,除非你創建了somefunc作爲一個擴展方法,如果ob是被定義的,它並不一定是重要的。 – 2010-10-22 17:11:58

+0

是的你是對的,我在想C++。 – DanDan 2010-10-25 08:56:02

2

我說,對於C#邏輯AND(&&),第二個表達式爲false,因爲它們都需要爲真才能使表達式成爲true,編譯器會立即停止評估。

&& Operator (C# Reference)

有條件-AND運算符(& &)進行邏輯與的其布爾操作數,但如果必要的話只有評價其第二操作數。

與邏輯「與」相反,邏輯「或」(||)只需要所有表達式中的一個表達式爲真,以使整個表達式成立。因此,||運算符不是通過false評估短路,而是通過真正的評估使編譯器短路。

|| Operator (C# Reference)

現在,這是C#編譯器的行爲,但是這並不意味着每個編譯bahves這種方式,在VB.NET,你有兩個邏輯AND運算符(And,AndAlso)和兩個邏輯或運算符(OrOrElse)。用於位邏輯和邏輯連接的And運算符在第一個表達式返回false並評估其他運算符時不會短路,而AndAlso會在第一個邏輯表達式爲false時短接評估。這與OrOrElse相同,其中Or不會短路,OrElse可以。

And Operator (Visual Basic)

對兩個布爾表達式的邏輯相結合,或者在兩個數值表達式的逐位結合。

AndAlso Operator (Visual Basic)

執行短路兩個表達式的邏輯結合。

Or Operator (Visual Basic)

對兩個布爾表達式的邏輯析取,或在兩個數值表達式的逐位析取。

OrElse Operator (Visual Basic)

執行短路兩個表達式包括邏輯或。

總之,我要說這取決於你正在使用的編譯器。至於C#,它會發生短路。