Maison  >  Article  >  développement back-end  >  ## L'invocation de fonction récursive de queue a-t-elle un comportement non défini en C 11 ?

## L'invocation de fonction récursive de queue a-t-elle un comportement non défini en C 11 ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-25 11:17:02353parcourir

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

L'invocation de fonction récursive de queue est-elle un comportement non défini en C 11 ?

En C 11, des boucles infinies sans effets secondaires, telles que les suivantes , sont considérés comme un comportement indéfini (UB) selon la norme :

<code class="cpp">int main() {
   while (true) {}
}</code>

La même logique s'applique-t-elle à une récursivité infinie sans effets secondaires, comme le code ci-dessous ?

<code class="cpp">void foo() {
   foo();
}

int main() {
   foo();
}</code>

Réponse :

Oui, cette récursivité est également UB, car elle ne satisfait pas aux conditions énoncées dans la norme C 11 pour les critères de terminaison.

Plus précisément, la norme précise que l'implémentation peut supposer que n'importe quel thread effectuera éventuellement l'une des actions suivantes :

  • Terminer
  • Appeler une fonction d'E/S de bibliothèque
  • Accéder ou modifier un objet volatile
  • Effectuer une synchronisation ou une opération atomique

Les invocations de fonctions récursives en queue ne répondent à aucun de ces critères et sont donc considérées comme UB.

Il est important de notez que quelle que soit cette interprétation standard, une récursivité excessive peut toujours conduire à un comportement indéfini si elle dépasse la limite de l'implémentation pour les appels de fonctions récursives imbriquées. Cela a toujours été le cas en C .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn