C 11에서 Tail-Recursive 함수 호출이 정의되지 않은 동작인가요?
C 11에서는 다음과 같은 부작용이 없는 무한 루프가 발생합니다. 는 표준에 따라 정의되지 않은 동작(UB)으로 간주됩니다.
<code class="cpp">int main() { while (true) {} }</code>
아래 코드와 같이 부작용이 없는 무한 재귀에도 동일한 논리가 적용됩니까?
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
답변:
예, 이 재귀도 UB입니다. 종료 기준에 대한 C 11 표준에 설명된 조건을 충족하지 않기 때문입니다.
구체적으로 표준에서는 다음과 같이 명시합니다. 구현에서는 모든 스레드가 결국 다음 작업 중 하나를 수행할 것이라고 가정할 수 있습니다.
테일 재귀 함수 호출은 이러한 기준을 전혀 충족하지 않으므로 UB로 간주됩니다.
다음이 중요합니다. 이 표준 해석에 관계없이 과도한 재귀는 중첩된 재귀 함수 호출에 대한 구현 제한을 초과하는 경우 여전히 정의되지 않은 동작으로 이어질 수 있습니다. C에서는 항상 이런 일이 있었습니다.
위 내용은 ## C 11에서 꼬리 재귀 함수 호출이 정의되지 않은 동작인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!