Patronunuzun muhtemelen yapmaya çalıştığıM şey dahil olmak üzere sıfırdan geriye doğru saymak ve her sayı için bazı işlemler yapmaktı .
Ne yazık ki, bunun size gerçekten sonsuz bir döngü vereceği, sahip olabileceğiniz Mmaksimum size_tdeğerin olduğu bir uç durum var. Ve, işaretsiz bir değerin onu sıfırdan düşürdüğünüzde ne yapacağı iyi tanımlanmış olsa da, kodun kendisinin özensiz bir düşünce örneği olduğunu düşünüyorum, özellikle de patronlarınızın girişimlerinin eksiklikleri olmadan mükemmel bir şekilde uygulanabilir bir çözüm olduğu için.
Bu daha güvenli değişken (ve benim görüşüme göre, yine de sıkı bir kapsam sınırını korurken daha okunabilir olan) şöyle olacaktır:
{
std::size_t j = M;
do {
doSomethingWith(j);
} while (j-- != 0);
}
Örnek olarak, aşağıdaki koda bakın:
#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;
}
Bu, temelde bir ile aynı şeyi yapar unsigned shortve her bir değeri işlediğini görebilirsiniz :
Starting at 65535, we would loop 65536 times.
do..whileYukarıdaki koddaki döngüyü patronunuzun temelde yaptığı şeyle değiştirmek sonsuz bir döngü ile sonuçlanacaktır. Deneyin ve görün:
for (unsigned int us2 = us; us2 <= us; --us2) {
quant++;
}
size_tişaretsiz olduğundan, sıfırı kullanımdan kaldırmaya çalışırken döngüyü sonlandırırken maksimum değerine sarılması garanti edilir. Yine de korkunç kod.