Appeler la fonction principale plusieurs fois est une bonne pratique en C?

J’ai vu un code C comme ceci:

#include  void main () { static int ivar = 5; printf ("%d", ivar--); if (ivar) main (); } 

qui produit:

 54321 

Je suis un novice en C et jusqu’à ce que la condition échoue, la méthode main est appelée encore et encore. Puisque je suis novice en C, est-il recommandé d’appeler la fonction main plusieurs fois, comme dans le cas précédent? Existe-t-il des cas concrets dans lesquels ce type de code est très utile?

Merci d’avance.

Une boucle while serait plus appropriée. La récursivité a du sens lorsque, avec chaque récursion, vous effectuez un travail différent – généralement un travail plus petit.

En réalité, ce code montre les variables statiques locales: l’ ivar n’est initialisé que lors du premier appel de main . Chaque fois que vous recurse, il est décrémenté malgré l’instruction ivar=5 .

main a une signification particulière. Idéalement, il devrait initialiser l’environnement puis appeler une autre fonction qui pilote la logique de l’application.

Un compilateur optimiseur pourrait bien transformer ce code en une version itérative de toute façon.

Dans votre exemple, cela n’a pas d’importance, car il s’agit d’un très petit code. Mais dans le cas général, je pense que faire appel à main est une mauvaise idée pour les raisons suivantes:

  • Lisibilité. Lors de l’examen d’un programme, personne ne présumerait que le programme main sera appelé à un moment donné. Quand vous voyez que c’est le cas, vous devez revenir en arrière et relire le tout. De plus, main n’est pas un nom significatif en ce sens que l’intention de la récursion n’est pas claire. Je voudrais donc écrire une autre fonction avec un nom significatif pour refléter cela.
  • Réutilisabilité. Il est fort probable qu’une nouvelle fonction portant un nom explicite sera utile à plusieurs endroits d’un programme complexe.
  • Arguments en ligne de commande. À un moment donné, vous aurez peut-être besoin d’arguments de ligne de commande dans votre programme. Même les programmes graphiques en ont besoin (pour les associations de fichiers, etc.). Et vous devrez refactoriser tous vos appels vers main pour en tenir compte.
  • Compatibilité C ++. C’est illégal en C ++.

Je dirais que c’est rarement, voire jamais, une bonne idée d’appeler la fonction main . Si vous voulez recurse, créez une fonction pour le faire.

Cela n’est pas souvent vu (je ne l’ai jamais vu auparavant), très déroutant, car main est censé être appelé une fois lorsque le programme commence et se termine à la fin du programme, et pratiquement impraticable dans la plupart des programmes réels, car il vous faudrait pour empêcher les appels suivants à main () d’parsingr à nouveau la ligne de commande.

Il est beaucoup plus raisonnable d’écrire une fonction récursive distincte et de l’appeler depuis la fonction principale en utilisant des arguments de fonction ordinaires au lieu de variables statiques.

C’est ce qu’on appelle la récursivité et cela peut être très utile. Par exemple traverser un arbre. Certains calculs mathématiques utilisent également la récursivité.