2017-10-16 1 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--)가 잘못되었다고 생각하지 않습니다.이 부작용은 a를 1 씩 줄이는 것입니다.이 부작용은 내가 원하는 것입니다. 감사.

+1

'--a'와'a -'의 차이점은 무엇입니까? 7 번째 줄과 8 번째 줄에'recursion'에 전달되는 실제 값에 대해 생각하십시오. – Ryan

+0

'int tmp = a--; 재귀 (tmp);'<- 어때요? – zerkms

+0

'recursion (a -);'매번 재귀 호출 (a);'매번 호출하면 감소하지만 더 이상 사용되지 않습니다. –

답변

2

--aa--은 모두 a의 증가 효과가 있습니다. 차이는 a--의 값이 감소하는 전에 a의 값이 동시에 발현 --a의 값이 감소하는 후a의 값이라고한다.

따라서 후자의 경우 동일한 값인 a이 재귀 적으로 함수에 전달됩니다. 결과적으로 무한 반복 루프가 발생하여 스택 오버플로가 발생합니다.

감소 호출 a을 함수에 전달하려면 재귀 호출에 recursion(--a)을 사용해야합니다.

+0

왜 이렇게 되었습니까? 왜? - 감소하기 전의 가치는 무엇입니까? 나는 설명을 못 찾는다. 우선 순위 측면에서 보면 a와 a는 모두 함수 호출 전에 먼저 수행되어야하기 때문에 바인딩이 필요합니다. –

+1

@ChuanyuanLiu 두 경우 모두'a'는 함수가 호출되기 전에 항상 업데이트됩니다. 차이점은 _expressions_가 다르게 평가된다는 것입니다. 따라서 'a -'의 경우 함수에 전달 된 값은 해당 코드 행을 실행 한 후에'a'의 값과 다릅니다. – Lundin