我確定這個問題可能以前已經回答過,所以我很抱歉,但我無法找到正確的搜索條件來找到答案。編譯器是否繼續評估一個表達式,如果第一個表達式爲假,那麼所有表達式都必須爲真?
給出以下代碼示例,db.GetRecords().Any()
是否被執行?
string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
db.GetRecords().Any();
我確定這個問題可能以前已經回答過,所以我很抱歉,但我無法找到正確的搜索條件來找到答案。編譯器是否繼續評估一個表達式,如果第一個表達式爲假,那麼所有表達式都必須爲真?
給出以下代碼示例,db.GetRecords().Any()
是否被執行?
string s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &&
db.GetRecords().Any();
號兩者&&
和||
由short-circuit evaluation評價。這意味着如果a
爲假,a && b
返回false,並且a || b
返回true,如果a
爲真,並且在這兩種情況下都不會評估b
。
如果由於某種原因您不想進行短路評估,則可以使用按位運算符&
和|
。
實際上是否有充分的理由使用單數和| ? – 2010-10-22 14:56:09
@ eddy56&and |通常用於評估可以設置多個標誌的標誌。 – 2010-10-22 14:57:22
不,C#使用短路和。所以答案是no。
如果您需要同時評估,請使用非短路操作符,只需使用一個和號&。
tring s = "Z";
bool x = s.IndexOfAny(new[] { 'A', 'B' }) > 0 &
db.GetRecords().Any();
請注意單個&。
據短路,並允許你做這樣的事情:
if(ob && ob.somefunc()) { ... }
如果兩個進行了評價,就引用了null對象,這將是一個運行時異常的可能性。
我認爲你的意思是'if(ob!= null && ..',因爲唯一可行的方法是ob是一個bool,而bools並沒有真正的方法,除非你創建了somefunc作爲一個擴展方法,如果ob是被定義的,它並不一定是重要的。 – 2010-10-22 17:11:58
是的你是對的,我在想C++。 – DanDan 2010-10-25 08:56:02
我說,對於C#邏輯AND(&&
),第二個表達式爲false,因爲它們都需要爲真才能使表達式成爲true,編譯器會立即停止評估。
有條件-AND運算符(& &)進行邏輯與的其布爾操作數,但如果必要的話只有評價其第二操作數。
與邏輯「與」相反,邏輯「或」(||
)只需要所有表達式中的一個表達式爲真,以使整個表達式成立。因此,||
運算符不是通過false
評估短路,而是通過真正的評估使編譯器短路。
現在,這是C#編譯器的行爲,但是這並不意味着每個編譯bahves這種方式,在VB.NET,你有兩個邏輯AND運算符(And
,AndAlso
)和兩個邏輯或運算符(Or
,OrElse
)。用於位邏輯和邏輯連接的And
運算符在第一個表達式返回false並評估其他運算符時不會短路,而AndAlso
會在第一個邏輯表達式爲false時短接評估。這與Or
和OrElse
相同,其中Or
不會短路,OrElse
可以。
對兩個布爾表達式的邏輯相結合,或者在兩個數值表達式的逐位結合。
AndAlso Operator (Visual Basic)
執行短路兩個表達式的邏輯結合。
對兩個布爾表達式的邏輯析取,或在兩個數值表達式的逐位析取。
OrElse Operator (Visual Basic)
執行短路兩個表達式包括邏輯或。
總之,我要說這取決於你正在使用的編譯器。至於C#,它會發生短路。
你可以嘗試一些簡單的功能,你會得到你的答案。 – 2010-10-22 14:11:53
@Gunner好點。我應該想到這一點。我想今天早上咖啡還不夠。 – 2010-10-22 14:15:20