2017-10-16 148 views
0
#include <stdio.h> 
#include <stdlib.h> 

#define TRUE 1 
#define FALSE 0 

void recursion (int a) { 
    if (a != 0) { 
     recursion(--a); //works 
     recursion(a--); //does not work 
     printf("%d\n", a); 
    } 
} 

int main (int argc, char *argv[]) { 
    printf("start\n"); 
    recursion(10); 
    printf("finished\n"); 
    return 0; 
} 

爲什麼當遞歸(a--)時會出現分段錯誤,但在遞歸(--a)時工作正常?- a vs a--,運算符優先級

我不認爲遞歸(a--)由於未定義的行爲是錯誤的,因爲只有一個副作用,就是減少1。這種副作用正是我想要的。謝謝。

+1

你知道'--a'和'a - '之間的區別嗎?考慮第7行和第8行傳遞給'遞歸'的實際值。 – Ryan

+0

'int tmp = a--;遞歸(tmp);'< - 那怎麼樣? – zerkms

+0

遞歸(a - );'調用'遞歸(a);'每次減少a,但減小後的值不再使用 –

回答

2

--aa--都有增加a的副作用。不同的是,表達--a的值的a遞減的值,而a--的值是a之前遞減的值。

因此在後一種情況下,遞歸地將相同的值a傳遞給函數。因此,你有一個無限的遞歸循環,導致堆棧溢出。

您需要使用recursion(--a)進行遞歸調用,以便將遞減值a傳遞給函數。

+0

這是爲什麼呢?爲什麼a--是遞減前的價值?我找不到解釋。根據優先級a--和 - all將在函數調用之前執行,因爲它們必須具有約束力。 –

+1

@ChuanyuanLiu無論哪種情況,在函數調用之前'a'總是會被更新。不同之處在於_expressions_的計算方式不同,因此在執行該代碼行後,傳遞給函數的值與「a」的值不同。 – Lundin