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 :
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!