7 votes

Les boucles sans fin sont-elles mal vues ?

J'ai donc un code C++ pour le back-tracking des nœuds dans un algorithme BFS. Il ressemble un peu à ceci :

typedef std::map<int> MapType;
bool IsValuePresent(const MapType& myMap, int beginVal, int searchVal)
{
    int current_val = beginVal;
    while (true)
    {
        if (current_val == searchVal)
            return true;

        MapType::iterator it = myMap.find(current_val);
        assert(current_val != myMap.end());
        if (current_val == it->second) // end of the line
            return false;
        current_val = it->second;
    }
}

Toutefois, le while (true) me semble... suspect. Je sais que ce code fonctionne, et logiquement je sais qu'il devrait fonctionner. Cependant, je n'arrive pas à me débarrasser du sentiment qu'il devrait y avoir une condition dans l'élément while mais la seule solution possible est d'utiliser un bool variable juste pour dire si c'est fait. Dois-je cesser de m'inquiéter ? Ou est-ce que c'est vraiment une mauvaise forme.

EDITAR : Merci à tous ceux qui ont remarqué qu'il y avait un moyen de contourner ce problème. Cependant, j'aimerais savoir s'il existe d'autres cas valables.

22voto

JaredPar Points 333733

Je pense qu'il existe des cas où l'existence de boucles apparemment infinies est acceptable. Cependant, ceci ne semble pas être l'un d'entre eux. Il semble que vous pourriez tout aussi bien écrire le code comme suit

while (current_val != searchVal ) {
    MapType::iterator it = myMap.find(current_val);
    assert(current_val != myMap.end());
    if (current_val == it->second) // end of the line
        return false;
    current_val = it->second
}
return true;

Cela semble mieux exprimer la véritable intention de la boucle

13voto

Todd Gardner Points 8688

Mon avis est le suivant : le code doit être auto-documentaire . En d'autres termes, lorsqu'on me donne un morceau de code, je préfère être en mesure de regarder et de déterminer l'intention du programmeur plutôt que d'avoir à lire des commentaires ou à me débattre dans le code environnant. Lorsque je lis :

while(true)

Cela m'indique que le programmeur voulait une boucle infinie ; que la condition de fin ne pouvait pas être spécifiée. C'est l'intention du programmeur dans certaines circonstances, une boucle de serveur par exemple, et c'est à ce moment-là qu'il faut l'utiliser.

Dans le code ci-dessus, la boucle n'est pas censée être éternelle, elle a une condition de fin claire, et pour être sémantiquement claire, comme d'autres l'ont souligné :

while (currentVal != searchVal)

fonctionne, de sorte que le while(true) est clairement inférieur et doit être évité dans ce cas.

6voto

Jonathan Leffler Points 299946

Il y a des temps et des lieux pour les boucles infinies - je ne suis pas convaincu que ce soit le cas ici. D'un autre côté, ce problème est loin d'être flagrant dans le cas présent.

while (currentVal != searchVal)
{
    ...
}
return true;

Ils peuvent être utilisés lorsque le processus est vraiment indéfini - un processus démon avec une boucle de surveillance qui ne se termine pas.

5voto

beef2k Points 1852

Il y a des situations où une telle construction a du sens :

  1. La condition de rupture est calculée dans la boucle
  2. Les conditions de rupture sont plus nombreuses et toutes aussi importantes les unes que les autres
  3. Vous voulez vraiment une boucle sans fin ;) ..

5voto

jalf Points 142628

Je suis d'accord avec les autres réponses pour dire qu'il n'y a pas besoin d'une boucle infinie dans ce cas.

Cependant, un autre point pourrait être que lorsque vous faire ont une boucle infinie, for(;;) pourrait être une meilleure façon de l'exprimer. Certains compilateurs génèrent des avertissements pour les while(true) (la condition est toujours évaluée à false), et votre intention est moins claire parce qu'elle ressemble à n'importe quelle autre boucle. Peut-être que l'on disait while (x == true) et que vous avez accidentellement retiré le x au lieu de la true . for(;;) indique assez clairement qu'il s'agit d'une boucle infinie. Ou peut-être aviez-vous l'intention d'écrire quelque chose comme while(t) mais l'Intellisense de votre IDE s'est mis en marche et a décidé d'autocompléter en true .

for(;;) par contre, n'est pas quelque chose que l'on tape accidentellement. (et c'est plus facile à rechercher. while(true) pourrait aussi s'écrire while(1))

Aucune des deux versions n'est erroné mais for(;;) peut être plus intuitif car il y a est pas de condition de boucle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X