2014-10-09 102 views
-6

邏輯運算符&&在其左側執行表達式;只有它是真的,它纔會執行右側的表達式。邏輯&&在C

但在下面的例子中,

![C短路和實施例] [1]

如果LHS是假,並且不執行所述RHS然後它違反操作者的prcedence順序在C,因爲一元不擁有邏輯&&更高的優先級:

[C運算符優先級摘要] [2]

這是什麼邏輯背後?

+6

運算符優先級隻影響綁定,而不影響評估順序。請不要發佈圖片而不是代碼。特別難以理解的。 – 2014-10-09 14:49:43

+0

這就是&&操作符的工作方式。當左手錶達式爲假時,不評估右手錶達式。在你的情況下,右手錶達式是'!(a == -1)'。 – 2014-10-09 14:55:43

回答

2

考慮這個表達式:

a*b + c*d 

是執行哪個命令?那麼,我們知道+必須最後執行,但是這裏有沒有信息關於哪個乘法首先發生。

它可以這樣做:

t1 = a * b 
t2 = c * d 
result = t1 + t2 

或者,它可以這樣做:

t1 = c * d 
t2 = a * b 
result = t1 + t2 

有沒有辦法知道。

現在考慮這個表達式:

a>1 && b<2 

按道理講,沒有任何理由,爲什麼這需要任何特定的評估順序無論是。它可能發生在任何一個地方,它沒有任何區別。

,但有時它是重要的子表達式求值什麼樣的順序:

ptr != NULL && ptr->value == 1 

所以,作爲一個方便Ç定義&&操作員,保證評估秩序專項行爲。

如果C組沒有定義這樣,那麼我們不得不寫的一切是這樣的:

if (ptr != NULL) 
    if (ptr->value == 1) 
    result = true 

而且這將是一個PITA!

還有一個原因,除了簡單的文本方便:優化。

當一個&&表達式的一半評估爲false時,沒有理由檢查另一半的結果:這只是浪費時間和電力。所以,編譯器想要將其縮短。

除了編譯無法刪除任何可能有用戶可見的(或程序員可見的)副作用,除非程序員知道它會發生。

所以,再次,行爲必須明確定義:左邊然後右邊。如果不是這樣,那麼優化時可能會改變行爲,那樣會很糟糕。

1

當操作人員評估爲假時,操作員從左到右操作的邏輯有幾個原因,其中一個原因是在第一個操作被評估爲假後評估第二個操作是一種浪費,因爲整個條件在評估爲false之後,它將永遠不會評估爲True,還可以按照您的條件以避免錯誤的方式進行操作,例如:(對於C語言問題中的python感到抱歉,但是這是發生了什麼首先想到的)

if 'parameter' in dictionary and dictionary['parameter']: 
    (do something with parameter that you are now confident exists AND has a value); 

而如果順序顛倒

if dictionary['parameter'] and 'parameter' in dictionary: 

可能會引發錯誤,因爲要求字典中'參數'的值不存在是否否。

再一次,對於python感到抱歉,但我希望你能明白爲什麼這個功能對你有利,並且可以被精明的編碼器利用。