2010-05-19 78 views
12

我想知道當一個程序處理具有多個條件的if結構時會發生什麼。我有一個想法,但我不確定。我舉一個例子:如果if結構的第一部分是假的,會發生什麼?

List<string> myTestList = null; 
if (myTestList != null && myTestList.Count > 0) 
{ 
    //process 
} 

列表爲空。在處理if語句時,是否會從一個條件爲假的情況下從左向右退出if?

我試過了,似乎沒有發現錯誤,所以我假設上面解釋了它,但我不確定。

+0

當你添加一個'else'條款,你看到了什麼情況? – 2010-05-19 10:07:57

+0

它被調用,這就是爲什麼我認爲如果在條件爲假的情況下發生故障 – Terry 2010-05-19 10:20:01

+0

「崩潰」? 「打破」是什麼意思? – 2010-05-19 10:58:56

回答

23

這是重要的&&。這是短路,所以Count永遠不會被評估;條件從左到右進行評估。

還有一個非短路運算符(&),但它是很難看到在if測試中;它主要用於按位操作(在int等)。

從規格:

條件邏輯運算符

&&||符被稱爲條件邏輯運算符。 它們也被稱爲 「短路」邏輯運算符。

...

&&||運營商是&| 運營商的條件版本:

  • 操作x && y對應於操作x & y,除了y 只有當評估x不是false
  • 操作x || y對應於操作x | y,不同之處在於y 僅當x不是true進行評價。
2

在C#和大多數語言,&&||短路,即,如果表達式的第一部分就足以確定結果,第二部分是保證不執行。

您使用的代碼是慣用的C#代碼。

2

如果參考文獻是null,評估將立即停止。這就是所謂的邏輯表達式短路評估 - 如果&&的左邊部分是false,則根本不評估權利。

2

它被短路。

a && b 

如果a是假的,b將不進行評估。我們可以使用這種行爲,因爲表達式將始終爲假。

同樣,

a || b 

如果a是真實的,b將不進行評估。

6

在大多數(但不是全部)現代語言中,都有一個稱爲"short circuit boolean evaluation"的功能。這意味着如果&&條件的第一部分是錯誤的,那麼第二部分根本不會被評估。

類似的功能適用於||,其中如果第一部分是true,則不評估第二部分。

請注意,此功能不限於if語句。下面的內容也是有效的,不會嘗試引用Count如果myTestListnull

bool b = myTestList != null && myTestList.Count > 0; 
1

是,短路評價應該被使用。我本人不是C#開發人員,但我從this Wikipedia article讀到這個。

2

大多數現代編程語言,包括C#,都實現了所謂的麥卡錫序貫連接算子。這意味着:

a && b <=> a ? b : false 

如果你看看這兩個等價表達式的第二,它變得很清楚,b評估當且僅當a是真實的。相反地​​:

a || b <=> a ? true : b 
0
對於

在下面的示例程序:

空隙測試() { BOOL F1 = 0; bool f2 = 0;

如果(F2 & &(F1 = 1)){ COUT < < 「內部1」 < < ENDL; } COUT < < 「F1」 < < F1 < < 「:F2:」 < < F2 < < ENDL;

如果((F1 = 1)& & F2) {COUT < < 「內部2」 < < ENDL; } COUT < < 「F1」 < < F1 < < 「:F2:」 < < F2 < < ENDL; }

輸出將是: F1 0:F2:0

F1 1:F2:0

這基本上示出了從左至右正在執行的,如果循環。 1.在第一個if循環中,第一個條件失敗,並且不費心去測試第二部分。 2.在第二個if循環中,首先運行第一部分,然後運行第二部分。

這將適用於C++。希望這可以幫助。

  • 伊瓦
相關問題