2017-03-12 2 views
0

코드 1 : -C 코드의 차이점은 무엇입니까?

int f(int val) { 
    int x=0; 
    while(val > 0) { 
     x = x + f(val--); 
    } 
    return val; 
} 

코드 2 : -

int g(int val) { 
    int x = 0; 
    while(val > 0) { 
     x= x + g(val-1); 
    } 
    return val; 
} 

코드 f(3)g(3)의 실행의 차이는 무엇입니까?


Code 1은 분명합니다. 그런 다음 f(3)은 계속 더 깊고 깊어지고 반복되는 함수를 추적하는 데 사용되는 공간이 채워지면 스택 오버플로 오류가 발생합니다.

그러나 나는 실제로 두 번째 코드 실행에 집착하고 있습니다. 나는 그것을 달리고 무한 루프를 얻는다.

또한 val--val-1으로 작성 될 수 있음을 읽었습니다. 그래서, 둘 다 매우 다른 행동을하기 때문에, 라인 val-1을 해석 할 때 어떻게 잘못 될까요?

+2

'val'의 값이'g'에서 결코 바뀌지 않으므로 무한 루프가 발생합니다. 당신이 전혀 디버깅하지 않았다면 눈치 챘을 것입니다. – StoryTeller

+0

이것은 종이 디버깅이 도움이 될 수있는 좋은 예입니다. 실행중인 각 단계에서 모든 변수의 값을 쓰고 코드가 다음에 수행 할 작업을 결정하십시오. –

+1

'val -'과'val - 1'은 매우 다른 두 가지입니다. 첫 번째 것은 val의 값을 변경하지만 두 번째 값은 변경하지 않습니다. –

답변

1

val--val = val -1과 같으므로 val의 값을 1 씩 줄이고 새 값을 저장합니다 (감소). val -1은 단지 감소하고 변수 val에 저장하지 않고 새로운 값을 반환합니다 (실제로 감소하는 하프닝 없음). 이것이 무한 루프를 가지는 이유입니다. 여기

int g(int val) { 
    int x = 0; 
    while(val > 0) { 
     val = val - 1; 
     x= x + g(val); 
    } 
    return val; 
} 

이 증가와 감소 연산자에 대한 참조입니다 : 나는 이러한 변화를 추천 발하면서, 1 발을 감소와 val에 다시 저장 val-- http://en.cppreference.com/w/cpp/language/operator_incdec

0

-1 단순히 발에서 1을 빼는 이것은 당신이 while 회 돌이에서 결코 벗어날 수 없다는 것을 의미합니다.

관련 문제