2011-04-15 75 views
1

嗯,我一直在閱讀了很多資源,但他們在definiton不同:術語問題:&&運營商

  • & &是邏輯 結合的邏輯運算符//我想這是正確的

  • & &是邏輯運算符AND // I 認爲這並不精確從 技術角度看

  • & &是 執行條件運算符 邏輯與//我認爲這是正確的 以及

雖然在所有的理解而言是正確的,我會說的第一個是最精確的。還是我誤會了?

+1

我也看到了「短路AND」,對於那些'&&'如果左邊是假的,它不會評估它的右邊的語言。 – sarnold 2011-04-15 09:08:45

回答

3

在C#中,Java,C++,C以及其他幾種語言,&&是布爾AND運算符的編程語言實現。它的目的是考慮到以下事實(指不以純命題邏輯適用):

  • 評估一個操作數計算上可能是昂貴的
  • 評估的操作可能會失敗,異常
  • 評估一個操作數可能會進入一個無限循環

所以在編程語言中的布爾表達式真有四種可能的結果:truefalse,「例外」和「無限循環」。在某些情況下,有兩個布爾表達式,第二個表達式的可能成功可以通過查看第一個表達式來確定。例如,使用表達式foo != nullfoo.bar == 42,我們可以確定,如果第一個表達式爲假,那麼第二個表達式將失敗。因此,&&運算符被設計爲「short-cirquited」:如果左操作數計算結果爲false,則不計算右操作數。在兩個操作數都能成功評估爲真或假的所有情況下,這個規則產生的結果與實際上已經評估了兩個操作數的結果相同,但它允許提高性能(因爲根本不需要評估右操作數)和在不犧牲安全性的情況下增加緊湊性(如果注意表達結構以使左操作數「保護」正確的表達)。同樣,如果左操作數的計算結果爲true,||將不會評估右操作數。

更短的答案是,雖然&&是強烈和啓發,它的設計採取一定的編程特點考慮在內,並a && b或許應該寧可被表述爲「返回false,如果a是假的表達,和值b如果a爲真「。

0

連詞是另一個詞「和」。所以他們在輸出方面都是正確的。

就其實際給出輸出而言,&&通常不會評估第二個參數,如果第一個參數爲假。

+0

'通常'?這不是在C#標準中定義的嗎? – jgauffin 2011-04-15 09:16:02

+0

@jgauffin:我的意思是「通常」,如「在大多數語言中」。 – Mehrdad 2011-04-15 09:25:19

+0

問題用'c#'標記。 – jgauffin 2011-04-15 09:29:12

1

簡單的答案。

它對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未被分配。最後一個例子]

我希望能清理一些東西。