>  기사  >  백엔드 개발  >  ## C 11에서 꼬리 재귀 함수 호출이 정의되지 않은 동작인가요?

## C 11에서 꼬리 재귀 함수 호출이 정의되지 않은 동작인가요?

Barbara Streisand
Barbara Streisand원래의
2024-10-25 11:17:02353검색

## Is Tail-Recursive Function Invocation Undefined Behavior in C  11?

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 표준에 설명된 조건을 충족하지 않기 때문입니다.

구체적으로 표준에서는 다음과 같이 명시합니다. 구현에서는 모든 스레드가 결국 다음 작업 중 하나를 수행할 것이라고 가정할 수 있습니다.

  • 종료
  • 라이브러리 I/O 함수 호출
  • 액세스 또는 수정 휘발성 객체
  • 동기화 또는 원자적 연산 수행

테일 재귀 함수 호출은 이러한 기준을 전혀 충족하지 않으므로 UB로 간주됩니다.

다음이 중요합니다. 이 표준 해석에 관계없이 과도한 재귀는 중첩된 재귀 함수 호출에 대한 구현 제한을 초과하는 경우 여전히 정의되지 않은 동작으로 이어질 수 있습니다. C에서는 항상 이런 일이 있었습니다.

위 내용은 ## C 11에서 꼬리 재귀 함수 호출이 정의되지 않은 동작인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.