2014-08-28 112 views
0

我們有一個表達優先級和結合在邏輯運算符用C

int x,y,z; 
x=y=z=2; 

y=++x || --y; 

printf("%d %d",x,y); 

它給x=3y=2作爲輸出,但我認爲我們在這裏有4個運營商:++--||=

我們知道++--具有最高的優先級,所以他們必須先評估,然後||,然後=

另外我們知道++--具有相同的優先級,所以我們使用關聯性,在這種情況下,它是正確的左邊。所以我認爲首先--y將被評估,其中y=1,然後++x這應該給x=3,然後||應評估。

爲什麼我從我的機器得到不同的答案?謝謝。

+2

優先順序與評估順序無關。無論如何,它是未定義的行爲,如果'--y'被評估。在這種情況下,你實際尋找的是短路評估,因爲實際上'--y'在這裏沒有被評估。 – chris 2014-08-28 18:27:16

+0

請停止使用複雜,無方括號的表達式和可疑行爲編寫垃圾代碼。它會讓你被解僱。 – 2014-08-28 20:58:15

回答

1

操作員的優先級與評估順序無關。請注意,子表達式的評估順序與結合性和優先級無關。

,其中在被評估的表達式的操作數是 未指定在C的唯一保證是,它們都將在 下一序列點完全評價的順序。

對您的情況x++進行了評估,其中--y未被評估,它正在爲您創建問題。

+0

這個特殊情況不是未定義的,因爲'++ x'是「true」。 – chris 2014-08-28 18:30:15

+0

@chris: - 是的。感謝您指出! – 2014-08-28 18:31:19

+0

請清楚解釋。那麼優先級和相關性的需求是什麼?爲什麼他們說操作員具有同等優先權時,我們需要從右向左進行評估?如果您可以舉例說明,那麼它會更便於理解。 – Navdeep 2014-08-28 18:39:50