Ce que votre patron était probablement en essayant à faire était de compter à rebours à partir de M
à zéro inclus, en effectuant une action sur chaque nombre.
Malheureusement, il y a un cas limite où cela va en effet vous donne une boucle infinie, celle où M
est le maximum size_t
valeur que vous pouvez avoir. Et, bien qu'il soit bien défini ce qu'une valeur non signée fera lorsque vous la décrémentez de zéro, je maintiens que le code lui-même est un exemple de pensée bâclée, d'autant plus qu'il existe une solution parfaitement viable sans les défauts de la tentative de votre patron.
Cette variante plus sûre (et plus lisible, à mon avis, tout en maintenant une limite de portée serrée), serait :
{
std::size_t j = M;
do {
doSomethingWith(j);
} while (j-- != 0);
}
À titre d'exemple, voyez le code suivant :
#include <iostream>
#include <cstdint>
#include <climits>
int main (void) {
uint32_t quant = 0;
unsigned short us = USHRT_MAX;
std::cout << "Starting at " << us;
do {
quant++;
} while (us-- != 0);
std::cout << ", we would loop " << quant << " times.\n";
return 0;
}
Cela fait essentiellement la même chose avec un unsigned short
et vous pouvez voir les processus chaque valeur unique :
Starting at 65535, we would loop 65536 times.
Remplacer le do..while
dans le code ci-dessus avec ce que votre patron a fait en gros résultera en une boucle infinie. Essayez et voyez :
for (unsigned int us2 = us; us2 <= us; --us2) {
quant++;
}