2014-02-06 71 views
3

對於以下代碼:優先級是否使得<在==之前執行?

int main() 
{ 
    int a, b, c, d; 
    c = 5; 
    d = 5; 
    a = 10; 
    b = 8; 
    if (a == c++ && b < d++); 
    printf("c=%d d=%d\n", c, d); 
    return 0; 
} 

輸出:c=6 d=5

我知道由於在if語句第一表達式評估爲假,則第二個表達式不評估因此輸出。然而,我通過Balaguruswamy讀在ANSI C下面的話:

由於操作<相比==享有更高的優先級,b < d++ 被評估第一和然後a == c++

現在根據這一點,不應該的d值成爲6而不是c

+1

子表達式的評估順序與結合性和優先級無關。關聯性和優先級確定操作符以什麼順序執行,但不確定子表達式的評估順序。運算符'&&','''''''就像引入了一個序列點。在&&,||的情況下操作員評估發生在從左到右的情況下,完整的表達式評估符合短路邏輯 –

+0

本書中是否也包含與您正在引用的文本相關的代碼?報價中並沒有提及'&&'操作符 - 這在這段代碼中非常重要。 – nos

+3

它與&&代碼相同。這本書是錯誤的。我只是在確認。我希望我們有一本毫不含糊的書。我的一半時間都在糾正這些書上浪費了! – user3152736

回答

4

NO。如果這本書被引用,對於這個具體問題,那麼這本書是錯誤的(我的建議是讓一個更好:我建議C primer plus)。邏輯運算符&&||總是從左到右進行計算。在這種情況下,b < d++未被評估爲a == c++false(由於邏輯運算符&&的短路行爲)。 d根本不增加,它仍然等於5

+0

所以書中的陳述是不正確的,對吧?即使<確實享有比==更高的優先級,在這種情況下,它不會被首先評估,對嗎? – user3152736

+1

@ user3152736是的。 – haccks

+0

@EricPostpischil; ''由於運算符<與==相比具有更高的優先級,因此首先計算b haccks

2

false && anything總是false,所以當左手已經false它是多餘的檢查右側。這就是爲什麼只有a增加並且d保持初始值。


編輯:這本書是錯誤的。

+0

我知道!請正確閱讀我的完整問題 – user3152736

+0

'&&'從左到右進行評估。 – Maroun

+0

@ᴍarounᴍaroun:問題不在於如何評估&&。這是問這本書的內容似乎與此相矛盾。答案是這本書是錯誤的(如果它在上下文中被正確引用)。 –

-3

<之前==

Precedence table

+1

但這在這個表達式中並不重要。 – glglgl

+3

'<'並不總是在'=='之前執行。例如,在'0 == 0 && 1 <2'中,首先評估'0 == 0',然後評估'1 <2'。 –

2

執行由於操作<相比==享有更高的優先級,B < d ++首先計算,然後== C++。

但是,由於這些運算符並非彼此相鄰使用,所以它們的相對優先級並不重要。

a == c++首先計算,並且如果它的計算結果只true(即!= 0)將b < d++表達進行評估。

+0

您能否給我舉一個這些操作員彼此相鄰的例子?我會爲此付出生命! – user3152736

+0

@OP'a == b chux

+0

太棒了!謝謝! – user3152736

0

我認爲你遇到的問題是d ++沒有執行。它被稱爲邏輯運算符短路 - >基本上,正確的表達式永遠不會被執行。

查看this link瞭解更多信息。

+0

問題不在於此。這是關於書中的文字與'd ++'不被執行的事實相矛盾的。 –

+0

即使措辭沒有具體要求;我覺得問題在於爲什麼d ++沒有按照直覺來執行......因此我的答案 – Pandrei

4

這本書的內容是錯誤的,假設你已經在上下文中正確引用了它。

a == c++ && b < d++中,由於語法規則,該表達式被分組爲(a == c++) && (b < d++)。但是,事物分組的優先級並不完全決定它們的評估順序。

優先級是一個編譯時屬性,它告訴我們表達式的結構。評估是一種運行時行爲,告訴我們如何計算表達式。


優先部分確定因爲之前操作者的操作者的操作數必須進行評估的評估順序。例如,在(a*b)+(c-d),a*bc-d必須評估之前+可以評估。這不是根據語法或優先級或關聯的規則,而只是因爲在知道其操作數的值之前無法計算出+的值。但請注意,雖然*的優先級高於-,但優先級並不會告訴我們哪個a*bc-d是首先評估的。

+2

我喜歡你的答案,但我不同意這條線,「事物分組的優先順序並不決定它們的順序評估「* - 在*分組*評估然後優先事項。 '優先'是強加評價的順序。當表達式中出現不同類型的運算符時,優先規則失敗,例如,在OP的代碼中,數學和邏輯運算符出現在相同的表達式中 - 我的優先級可能會影響評估順序。 –

+1

@GrijeshChauhan:我更新了答案,將其更改爲優先不會「完全確定」訂單。 –