Maison >développement back-end >C++ >Pourquoi mon code C entre-t-il dans une boucle infinie malgré une affectation apparemment inoffensive ?

Pourquoi mon code C entre-t-il dans une boucle infinie malgré une affectation apparemment inoffensive ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-04 13:58:02478parcourir

Why Does My C   Code Enter an Infinite Loop Despite a Seemingly Harmless Assignment?

Boucle de sortie infinie en C

Dans le code C fourni, une boucle sans fin inattendue se produit, imprimant une série continue de nombres ("0 , 1, 2, 3, 4, 5,...") au lieu du "0, 1, 2, 3" attendu.

Un examen plus approfondi révèle que le coupable est la déclaration d'affectation apparemment inoffensive "delta = mc[di]" dans la boucle. Cette affectation déclenche un comportement indéfini car elle accède au tableau mc hors limites lors de la dernière itération (c'est-à-dire "di = 4").

Dans le cadre d'optimisations de boucle agressives, le compilateur peut supposer l'absence de comportement indéfini. En conséquence, il optimise la boucle en éliminant le di < 4 vérification, conduisant à une exécution en boucle continue.

Pour garantir un comportement correct, il est crucial d'éviter les comportements indéfinis, même dans un code optimisé. Dans ce cas, la solution consiste à garantir que mc est accessible dans les limites de la boucle.

Une approche alternative consiste à utiliser l'indicateur -fno-aggressive-loop-optimizations dans gcc pour désactiver les optimisations de boucle agressives. Cet indicateur force le compilateur à conserver le di < 4 vérifier et empêcher le comportement indéfini qui mène à la boucle infinie.

En comprenant les conséquences potentielles d'un comportement indéfini et en prenant les mesures appropriées pour l'éviter, les programmeurs peuvent garantir la fiabilité et l'exactitude de leur code 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