嗯,我一直在閱讀了很多資源,但他們在definiton不同:術語問題:&&運營商
& &是邏輯 結合的邏輯運算符//我想這是正確的
& &是邏輯運算符AND // I 認爲這並不精確從 技術角度看
- & &是 執行條件運算符 邏輯與//我認爲這是正確的 以及
雖然在所有的理解而言是正確的,我會說的第一個是最精確的。還是我誤會了?
嗯,我一直在閱讀了很多資源,但他們在definiton不同:術語問題:&&運營商
& &是邏輯 結合的邏輯運算符//我想這是正確的
& &是邏輯運算符AND // I 認爲這並不精確從 技術角度看
雖然在所有的理解而言是正確的,我會說的第一個是最精確的。還是我誤會了?
在C#中,Java,C++,C以及其他幾種語言,&&
是布爾AND運算符的編程語言實現。它的目的是考慮到以下事實(指不以純命題邏輯適用):
所以在編程語言中的布爾表達式真有四種可能的結果:true
,false
,「例外」和「無限循環」。在某些情況下,有兩個布爾表達式,第二個表達式的可能成功可以通過查看第一個表達式來確定。例如,使用表達式foo != null
和foo.bar == 42
,我們可以確定,如果第一個表達式爲假,那麼第二個表達式將失敗。因此,&&
運算符被設計爲「short-cirquited」:如果左操作數計算結果爲false,則不計算右操作數。在兩個操作數都能成功評估爲真或假的所有情況下,這個規則產生的結果與實際上已經評估了兩個操作數的結果相同,但它允許提高性能(因爲根本不需要評估右操作數)和在不犧牲安全性的情況下增加緊湊性(如果注意表達結構以使左操作數「保護」正確的表達)。同樣,如果左操作數的計算結果爲true,||
將不會評估右操作數。
更短的答案是,雖然&&
是強烈和啓發,它的設計採取一定的編程特點考慮在內,並a && b
或許應該寧可被表述爲「返回false,如果a
是假的表達,和值b
如果a
爲真「。
簡單的答案。
它對2個邏輯表達式執行AND操作,以返回布爾值。如果第一個是錯誤的,它不會評估第二個。
要評估兩者,無論使用&。
複雜的答案。
http://www.ecma-international.org/publications/standards/Ecma-334.htm標題12.3.3.23似乎最相關。
我發現自己不合格批評內的定義。
12.3.3.23 & &表達式
expr的形式
expr-first && expr-second
的表達式:•
expr-first
之前的v的明確賦值狀態是相同的expr之前的v的明確賦值狀態。•如果
exprfirst
之後的v的狀態是明確賦值的或「在真正表達式之後明確賦值」,則明確指定在expr-second
之前的v的明確賦值狀態。否則,它不會被無限期地分配。•位於expr之後的v的明確賦值狀態取決於:
o如果訴
expr-first
後的狀態是明確分配,則v在expr之後的狀態是明確分配。ο否則,如果expr-second
之後的v的狀態被明確賦值,並且expr-first
之後的v的狀態爲「在錯誤表達式之後明確賦值」,則明確指定expr之後的v的狀態。 ο否則,如果expr-second
之後的v的狀態是明確賦值或「在真表達式後明確賦值」,則expr之後的v的狀態爲「在真表達式之後明確賦值」。 ο否則,如果expr-first之後的v的狀態是「在錯誤表達式之後明確賦值」,並且expr-second之後的v的狀態是「在錯誤表達式之後明確賦值」,則表示expr之後的v的狀態是「在錯誤表達後明確分配的」。o否則,expr之後的v的狀態不是明確分配的。
[實施例:在下面的代碼
class A
{
static void F(int x, int y) {
int i;
if (x >= 0 && (i = y) >= 0) {
// i definitely assigned
}
else {
// i not definitely assigned
}
// i not definitely assigned
}
}
可變
i
在的if語句,但不是在其他嵌入式語句之一認爲是明確賦值。在方法F的if
語句中,變量i
在第一個嵌入語句中明確分配,因爲表達式(i = y
)的執行總是在執行此嵌入語句之前執行。相比之下,變量i在第二個嵌入語句中沒有明確賦值,因爲x >= 0
可能測試了錯誤,導致變量i
未被分配。最後一個例子]
我希望能清理一些東西。
我也看到了「短路AND」,對於那些'&&'如果左邊是假的,它不會評估它的右邊的語言。 – sarnold 2011-04-15 09:08:45