Maison >développement back-end >C++ >## La récursivité sans effets secondaires est-elle un comportement indéfini en C ?
La récursion sans effets secondaires est-elle un comportement indéfini ?
En C 11, les boucles infinies sans effets secondaires, telles que les suivantes, sont considérées comme indéfinies comportement (UB) :
<code class="cpp">int main() { while (true) {} }</code>
Le comportement est UB en raison d'une disposition de la norme ISO C 11 (1.10p24) qui stipule :
The implementation may assume that any thread will eventually do one of the following: - terminate, - make a call to a library I/O function, - access or modify a volatile object, or - perform a synchronization operation or an atomic operation.
Cette disposition s'applique à la fois au exemple de boucle et le programme récursif suivant :
<code class="cpp">void foo() { foo(); } int main() { foo(); }</code>
Dans ce programme récursif, il n'y a pas d'effets secondaires, mais il est également considéré comme UB car il viole l'hypothèse selon laquelle n'importe quel thread finira par effectuer l'une des actions répertoriées dans 1.10p24.
Notez que même si cette disposition n'existait pas, la récursivité pourrait toujours présenter un comportement indéfini si elle dépasse la limite définie par l'implémentation pour les appels de fonctions récursives imbriquées. Cela a toujours été le cas en C , quelle que soit la version.
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!