2014-09-05 6 views
-1

스택 오버 플로우가 발생하지 않고 다음을 수행 할 수 있습니까? foo(--i가) 0로 평가하면단락 회귀

int foo(int i = 0) 
{ 
    return foo(--i) || i; 
} 

, 그것은 때문에 i를 반환하고 실행을 종료 false를 반환해야합니다.

+1

'||'는 부울 표현식이므로 어쨌든 원하는 것은 아닙니다. 그러나 이것은 종료해야하는지 알 수있는 기회가 있기 전에 항상'foo'를 호출하기 때문에 작동하지 않습니다. – crashmstr

+0

당신이하려고하는 진짜 무엇입니까? – Kieveli

+3

먼저 종이를 사용해보십시오. 작동하지 않을 것입니다. –

답변

3

당신은 return !i || foo(--i)을 원합니다.

||은 단락입니다. 즉, 왼쪽에서 오른쪽으로 수행되는 평가는 표현식의 결과를 알 수없는 경우에만 계속됩니다. 그래서 내가 작성한 방식으로, i이 0 인 경우는 재귀를 차단합니다.

(고급 문제로 이동하는 경우 동일한 변수가 둘 이상의 하위 표현식에 나타나고 그 중 일부 값이 변경되면 표현식을 평가할 때 매우 신중해야합니다.) !i--i은 내가 문제가되는 곳에서 의 정의되지 않은 동작 여기에서 ||시퀀스 포인트이고 || 인 평가 순서가 잘 정의되어 있기 때문에 내 코드가 완전히 안전하다는 것이 밝혀졌습니다. 하지만 조심해야합니다.)

+0

어쩌면 질문은 분명히 IMHO가 아닙니다. 평가와 재귀 차단과 관련된 문제를 다루기 때문에이 답을 남겨 둘 것입니다. – Bathsheba

+0

@Debasish 쉬운 수정 :'return! i && foo (- i);' – user4011744

-1

코드 작성 내용 foo은 ntinuosly 감소하고 i 감소하고 재발합니다. 내부의 수표는 i0 일 때 원하는 것을 반환합니다.

+0

@DebasishJana 대체 대답이 아닌 질문의 복사 붙여 넣기 –

+0

사람들은 답을 잘못 듣고 무엇을 저에게 알려주십시오. –