Was Ihr Chef wahrscheinlich versucht hat , war, von Mbis einschließlich Null herunterzuzählen und für jede Zahl eine Aktion auszuführen.
Leider gibt es einen Randfall, bei dem Sie tatsächlich eine Endlosschleife erhalten, bei der Mes sich um den Maximalwert handelt size_t, den Sie haben können. Und obwohl genau definiert ist, was ein vorzeichenloser Wert bewirkt, wenn Sie ihn von Null dekrementieren, behaupte ich, dass der Code selbst ein Beispiel für schlampiges Denken ist, zumal es eine absolut praktikable Lösung gibt, ohne dass die Mängel Ihres Chefs es versuchen.
Diese sicherere Variante (und meiner Meinung nach besser lesbar, während immer noch ein enges Geltungsbereich eingehalten wird) wäre:
{
std::size_t j = M;
do {
doSomethingWith(j);
} while (j-- != 0);
}
Siehe beispielsweise den folgenden Code:
#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;
}
Dies macht im Grunde dasselbe mit einem unsigned shortund Sie können sehen, dass es jeden einzelnen Wert verarbeitet:
Starting at 65535, we would loop 65536 times.
Das Ersetzen der do..whileSchleife im obigen Code durch das, was Ihr Chef im Grunde getan hat, führt zu einer Endlosschleife. Probieren Sie es aus und sehen Sie:
for (unsigned int us2 = us; us2 <= us; --us2) {
quant++;
}
size_tist ohne Vorzeichen, wird also garantiert auf seinen Maximalwert umbrochen, wenn versucht wird, Null zu verwerfen, wodurch die Schleife beendet wird. Trotzdem schrecklicher Code.