2017-07-20 92 views
0

我一直在尋找布爾表達式評估的順序的解釋,但找不到一個。以什麼順序評估布爾表達式

看看這種說法:

if (locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0) 

這是如何評估的。
會是這樣的:

if ((locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0) 

或像這樣:

if (locClsTanken.PlaceID == -1 && (locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0)) 

是否有關於這個我不知道正確的搜索詞,是因爲英語不是我的語言的一些文檔。

我知道我可以測試它,但我想找到這個文件,所以我可以完全理解

+1

正如您從答案中發現的那樣,所尋找的術語是「優先」 - 但我也會注意到在我能想到的幾乎所有語言中,額外的括號不會強加性能損失,所以如果您完全不確定,只需插入括號,以便表達式*清楚地*做你打算做的事情。 –

+0

@Damien_The_Unbeliever是的,我總是使用括號,但我今天在somenones代碼中發現了這個表達式,並且想要確定將括號放在哪裏。謝謝 – GuidoG

+1

事實上,使用括號。你不僅應該編寫某種程序可行的代碼,還應該編寫其他人可以理解的代碼。如果你添加一些括號,至少下一個閱讀你的代碼的人不需要問這個問題。將條件重構爲函數可能對未來的程序員更好。如果你是未來的程序員,千萬不要錯過讓事情變得更好的機會:) – oerkelens

回答

5

&&||更高的優先級,所以

locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1 || locClsTanken.DagPrijs == 0 

被評估爲

(locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0 

請注意,&&||也短路,所以評估如果右邊的操作數可能會在評估左邊的操作數後改變結果,則只會出現右邊的操作數。

參考:https://msdn.microsoft.com/en-gb/library/aa691323(v=vs.71).aspx

+0

感謝您的鏈接 – GuidoG

2

表達進行熵從左到右除了該&&的優先級高於||
所以你的情況是會像

if ((locClsTanken.PlaceID == -1 && locRwF.PlaceID > -1) || locClsTanken.DagPrijs == 0) 

而且你正在尋找的是 符優先級看看這個link:Operators Precedence

2

在C#從編譯器移動技術千卡從左到右,這意味着它將首先評估最左邊的表達式(在您的情況下,即locClsTanken.PlaceID == -1

另外,&&具有更高的優先級比||->先得到評估

但是,可能會讓你困惑的是編譯器如何處理&&||&&&之間有區別。

&表示這兩個表達式都必須爲真,並且對這兩個表達式進行求值。但是,&&只會導致首先評估一個表達式。如果第一個表達式失敗,那麼第二個表達式就不會被求值,因爲爲了使&&成立,這兩個表達式都必須爲真。如果第一個已經失敗&&始終爲假 - >&&&更快並且更多「智能」