2010-12-15 24 views
4

不知道,如果在所有 IM這有意義試圖瞭解C#過程以下邏輯如何C#評估和OR表達沒有括號

false && true || false 
false || true && false 

基本上我試圖找出C#如何評價這些表達式當沒有括號時。

回答

4

由於該標準指定了operator precedence,因此編譯器會將其計算出來。

這就是說,如果一個表達式需要你去思考一秒以上關於什麼是按什麼順序發生更多...使用括號,以明確=)

+0

正如我的[措辭不佳]的答案試圖澄清......我認爲指出c#使用短路'&&'運算符是非常重要的。只要最初的錯誤被擊中,評估就會停止。儘管您的答案在覆蓋運算符優先級方面是一個很好的解決方案,但我認爲不要忘記這些細節是很重要的。 – 2010-12-17 11:20:57

3

C# Operators顯示運算符優先級:

false && true || false = (false && true) || false  = false 
false || true && false = false || (true && false)  = false 

&&(邏輯AND)具有比||(邏輯OR)

注意更高的優先級:這是很好的做法(有人可能會說最佳實踐)總是使用括號將邏輯表達式分組,以便意圖是明確的...

+0

不幸的是,這是一個不好的例子,因爲這些評估選擇相同的優先級:) – 2010-12-15 23:23:35

+0

這是一個相當糟糕的例子,因爲'((false && true)|| false)==(false &&(true || false))'和'(false ||(true && false))==((false || true)&& false)'。 – cHao 2010-12-15 23:29:37

+1

@cHao:你似乎在混淆發生的事情和實際的價值觀,並且總是如此。 – 2010-12-15 23:31:31

9

&&有一個更高的precedence||所以它首先評估。實際上,他們是等價於:

false && true || false => (false && true) || false => false 
false || true && false => false || (true && false) => false 

如果你不確定,使用括號。他們沒有真正的負面影響,任何使代碼更具可讀性的東西通常都是好事。

也許一個更好的例子(使得結果是不同的)本來:

true && false || false => (true && false) || false => false 
true || false && false => true || (false && false) => true 
0

的運營商將在operator precedence順序進行評價。

因此,基本上,AND之前OR s。你的例子是一樣的:

(false && true) || false 
false || (true && false) 
0

最重要的是...... C#使用短路操作。因此,整個事情是錯誤的 link text

2

大家都說關於運算符的優先順序和參考表,你可以看看。但我想提示一下如何記住它。如果你認爲false截至0,true截至1那麼&&就像是乘法,而||就像是加法(它們實際上被稱爲邏輯乘法和邏輯加法)。優先關係是相同的:乘法高於加法。它的工作原理是相同的:

0 * 0 == 0  |  false && false == false 
0 * 1 == 0  |  false && true == false 
1 * 0 == 0  |  true && false == false 
1 * 1 == 1  |  true && true == true 

0 + 0 == 0  |  false || false == false 
0 + 1 == 1  |  false || true == true 
1 + 0 == 1  |  true || false == true 
1 + 1 == 1*  |  true || true == true 

(*),它實際上是在2 1

,通常封頂,有疑問時,可使用括號。

-1

運算符優先級 短路評估 括號 從左到右。

-1

AND運算符的優先級高於OR運算符(請參閱http://msdn.microsoft.com/en-us/library/6a71f45d.aspx)。含義& &總是首先評估。

因此x && y || z被理解爲(x && y) || z

a || b && c應理解爲a || (b && c)

+0

已經有*多個*其他答案,包含所有這些已經存在多年的信息。這個答案沒有增加任何價值。 – Servy 2014-08-13 14:23:16