2014-04-16 4 views
-1
#include<stdio.h> 
#int add(int n); 

int main() 
{ 
    int n; 
    printf("Enter an positive integer: "); 
    scanf("%d",&n); 
    printf("Sum = %d",add(n)); 
    return 0; 
} 

int add(int n) 
{ 
    if(n!=0) 
    return n+add(n-1); /* recursive call */ 
} 

이 코드는 if(n==0){return 0;}과 같은 기본 사례없이 어떻게 실행됩니까?은 재귀 작업을 이해하는 데 도움이 필요합니다

+1

기능 유형이'# '으로 앞에 붙어있는 이유는 무엇입니까? – AntonH

+1

실수로 고생했다. – BOB

답변

2

기본 사례가 없으면 정의되지 않은 동작으로 코드가 생성됩니다. 컴파일러는 int을 반환하는 함수에 return 문이 없다는 경고를 발행합니다. 이것은 그것을 호출 한 함수가 가비지를 포함하거나 포함하지 않을 수있는 반환 값을 찾지 않는다는 것을 의미하지는 않습니다.

+0

코드는 잘 작동한다. – BOB

+3

그건 행운 때문에, 디자인 때문이 아니다. – JohnH

+0

@BOB : "정의되지 않은 행동"은 "어떤 일이 일어날 수 있음"을 의미합니다. "Working fine"은 "무엇이든", "보름달이있는 날에는 정상적으로 작동하며 초승달 날에는 루마니아에 암호를 전자 메일로 보냅니다."와 마찬가지입니다. –

0

현재 문제로 실행하는거야 : 당신이 값이 반환하지 않습니다 n <= 0 그래서 만약 addn-1add 통화 자체가 전달 때, 당신은 결국거야, n != 0 경우 값을 반환합니다 존재하지 않는 기본 케이스에 도달하면 나쁜 일이 일어납니다.

0
if(n==0){return 0;} 

은 기본 사례입니다. 재귀가 중지되도록하는 기본 사례가 있습니다. 기본 케이스가 없으면 어떤 종류의 오류가 발생할 때까지 무한히 반복됩니다. 귀하의 경우 그것은 음수를 추가 시작할 것입니다. 는 C 표준에서

+0

하지만이 코드는 작동하지 않습니다 ... 오류가없는 경우 – BOB

+1

n이 0이면 재귀를 중지시키는 if (n! = 0)가 있기 때문에 그 때문입니다. 유일한 차이점은 반환 값을 지정하지 않아서 정의되지 않았기 때문입니다 행동. 귀하의 경우에는 효과가 있지만 작동 보장되지는 않습니다. http://stackoverflow.com/questions/4644860/function-returns-value-without-return-statement – GriffinG

0

:

함수의 끝을 흐르는없이 값 리턴 동등하다; 이로 인해 값을 반환하는 함수에서 정의되지 않은 동작이 발생합니다.

귀하의 컴파일러는 경고를 수

는 모든 제어 경로는 값

그것은 this one과 같은 상황입니다을 반환합니다. 이것은 호출 규칙 및 아키텍처에 따라 다릅니다. 반환 값은 eax 레지스터에 저장된 마지막 표현식 평가의 결과입니다. 따라서 n==0 일 때 add() 함수는 0을 반환하지만 정의되지 않은 동작의 결과입니다.

관련 문제