2013-10-26 65 views
3

在下面的代碼:短路和在遞增/遞減操作者的情況下

#include <stdio.h> 

int main() 
{ 
    int a = 1; 
    int b = 1; 
    int c = a || --b; 
    int d = a-- && --b; 
    printf("a = %d, b = %d, c = %d, d = %d", a, b, c, d); 
    return 0; 
} 

我期待的輸出爲:

A = 0,B = 1,C = 1 ,d = 0

因爲由於在下面的行短路,即a--返回0所以其他部分將不會得到正確執行?

int d = a-- && --b; 

的輸出是:

A = 0,B = 0,C = 1,d = 0

誰能請解釋?

+1

'A - '計算結果爲' a',在本例中爲'1',然後遞減'a'。 – godel9

回答

5
int c = a || --b; 

在此行中,C標準需要 C實現評估a第一,如果它不爲零,不評價--b。儘管--||具有更高的優先級,但這僅僅意味着--b分組以用於確定表達式的結構,而不是用於評估它的目的。 ||運營商的左側必須在右側之前進行評估,如果左側爲真,則右側不得即使部分評估。

所以,在上面之後,b沒有改變;它仍然1.

int d = a-- && --b; 

是與||,所述&&的左手側被第一評價。因此評估a--。這將a更改爲0.但是,a--的值在更改前爲a,因此它爲1.值爲0將阻止評估右側(因爲一旦我們知道左側爲零,我們就知道完整&&表達式的值爲零)。但是,由於左側不是零,因此必須評估--b以完成&&。這將b更改爲0.「短路」意味着評估左側第一個,但右側仍在必要時評估。

+3

+1我認爲我們在這裏有一個完整和清晰的答案。 – Sadique

+0

是完整的答案。這真的很有意義 – niko

+0

是的 - 當我發佈了我的答案 - 我完全忽略了這樣一個事實,即有序列點在&&(邏輯與)的左和右操作數的評估之間, (邏輯或)(作爲短路評估的一部分)和逗號運算符' – Sadique

-2

您在混合a----a。表達式a--的結果是a之前的遞減量,而--aa之後的遞減量;換句話說:

int a = 1; 
int b = a--; // b == a == 1 
int c = --b; // c == b-1 == 0 

其結果是,你必須:

int d = a-- && --b; 
// => 1 && b-1 
// => 1 && 0 
// => 0 
+0

在原始代碼中沒有'int b = a - ;',並且在原始代碼中不對'c'的賦值評估'--b'。 –

+0

我並沒有試圖在那裏複製他的代碼。我認爲這很明顯,但有w/e。 –

5

在第一種情況下

int c = a || --b; 

這個a=1b=1c=1

a值之後爲1 , 因爲短路評價--b沒有進行

int d = a-- && --b; 

a--post decrement所以a遞減不會表達 效果,即作爲--b在這裏pre decrement所以效果

你的條件變得

int d= 1 && 0 ; 

此後a=0;,b=0,c=1d=0

+1

我不明白爲什麼你的答案是downvoted(我的答案相同)。所以,+1。 –

+0

感謝您的支持。我沒有坦率地解釋清楚。我被錯誤地解釋了。 – Gangadhar

+3

@Maxime:它被拒絕了,因爲它最初是錯誤的;它表示'--b'首先執行。從那以後它一直在編輯。 –

2

下面的線,即a--返回0

不,不。它產生1,因爲後減量運算符評估爲未修改的變量值。你在想什麼可能是--a

+0

第一次嘗試'1 - po'讓我感到困惑 –

+0

@GrijeshChauhan夠公平的。我已經說過了。 – 2013-10-26 12:23:30

+1

你的回答並沒有使我們滿意..你能否做出更明確的解釋 – niko

4

在第一操作,--b沒有執行,因爲a等於1:

int c = a || --b; 

b這裏遞減:

int d = a-- && --b; 

因爲a等於1,之後遞減評估(a--等於1)。換句話說,這條線是類似於:

int d = 1 && --b; 

b等於1所以現在b等於0現在。而d也等於0,因爲--b返回0

+0

你能告訴我爲什麼b仍然是0爲什麼不轉爲-1? 。 – niko

+0

@nico b此時等於1。這就是爲什麼。我會編輯以解釋上一行。 –

1
c = a || --b

所以在第一a is evaluateda值爲1這是true。所以編譯器不會評估--b。所以b值仍然1

現在

d = a-- && --b

a-- && --b =>1 && 0(自--b = 0)因爲b值爲1

爲什麼1 because a-- is post decrement operator

爲什麼0 because --b is pre decrement operator

所以1 & & 0返回0,這個值被保存在d

所以輸出:a = 0, b = 0, c = 1, d = 0

+0

這裏沒有關聯性。從左到右的相關性意味着'a || b || c'被分組爲'(a‖b)|| C'。這並不意味着'a'在'b'之前被評估。這是一個單獨的規則。 –