56 votes

Quelle est la meilleure façon de faire une boucle 'pour' inverse avec un index non signé?

Ma première tentative de renverser pour la boucle qui fait quelque chose n fois était quelque chose comme:

for ( unsigned int i = n-1; i >= 0; i-- ) {
    ...     
}

Cette échoue parce qu'en arithmétique non signée i est garanti pour être toujours plus grande ou égale à zéro, donc la condition de la boucle sera toujours vrai. Heureusement, le compilateur gcc m'a mis en garde au sujet d'un "inutile de comparaison" avant que j'ai eu à me demander pourquoi la boucle était en cours d'exécution à l'infini.


Je suis à la recherche d'une manière élégante de résoudre ce problème en gardant à l'esprit que:

  1. Il devrait être en arrière de la boucle.
  2. L'indice de boucle doit être signé.
  3. n est pas constante.
  4. Il ne devrait pas être fondée sur la 'obscur' anneau de l'arithmétique des entiers non signés.

Des idées? Merci :)

94voto

Skizz Points 30682

Que diriez-vous:

 for (unsigned i = n ; i-- > 0 ; )
{
  // do stuff with i
}
 

12voto

Lou Franco Points 48823
 for ( unsigned int loopIndex = n; loopIndex > 0; --loopIndex ) {
    unsigned int i = loopIndex - 1;
    ...
}
 

ou

 for ( unsigned int loopIndex = 0; loopIndex < n; ++loopIndex ) {
    unsigned int i = n - loopIndex - 1;
    ...
}
 

8voto

vartec Points 53382
for ( unsigned int i = n; i > 0; i-- ) {
    ...  
    i-1 //wherever you've been using i   
}

8voto

Pete Kirkham Points 32484

J'aurais tendance à utiliser

  for ( unsigned int i = n; i > 0; )  {
    --i;
    ...     
 }
 

c'est presque la même chose que la réponse de skizz (elle omet une dernière réduction inutile, mais le compilateur devrait l'optimiser) et passera en réalité l'examen du code. Toutes les normes de codage avec lesquelles j'ai dû travailler ont une règle de non-mutation conditionnelle.

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