Ogólny czynnikiem różnicującym między następujących pętli:
while (condition) {action}
do {action} while (condition)
jest to, że pierwszy służy do pętli, które zdarzają zerowy lub więcej razy, podczas gdy ten ostatni jest dla pętli, które zdarzają jeden lub więcej czasu .
Innymi słowy, warunek dla while
jest sprawdzany na początku pętli, a dla do while
jest sprawdzany na końcu.
Często zobaczysz kod gdzie deweloperzy nie wydają się wiedzieć o do-while
w które oni piszą:
result = doSomething();
while (result == NOT_FINISHED) {
result = doSomething();
}
które mogłyby być lepiej zapisać jako:
do {
result = doSomething();
} while (result == NOT_FINISHED);
Jednak w twoim konkretnym przypadku, gdy warunkiem jest zawsze true
, to naprawdę nie ma znaczenia. Poniższe pętle są zasadniczo równoważne (używając 1
dla prawdziwego przypadku):
for (;;) { doSomething(); }
for (;;doSomething());
while (1) { doSomething(); }
do { doSomething(); } while (1);
while (doSomething(),1);
BADPAX: doSomething(); goto BADPAX;
Pierwszy for
pętla jest prawdopodobnie kanoniczny sposób to zrobić nieskończoną pętlę, korzystając z faktu, że jeśli pominąć warunek kontynuacji dla pętli zakłada, że zawsze jest prawdziwa.
Druga pętla for
przesuwa korpus pętli do części iteracji instrukcji for
.
Pierwszy while
jest również czasami widywany na wolności, prawdopodobnie mniej. Jedyna różnica polega na tym, że poprzednie pętle na zawsze sprawdzają na górze pętli, a ostatnie pętle na zawsze sprawdzają na dole pętli.
Ostateczna while
pętli za pomocą operatora przecinek C w taki sposób, że prawdopodobnie nigdy nie powinien :-)
To ostatnie jest bardzo rzadkie w dzisiejszych czasach, ale to chyba wszystko co do ich optymalizacji w dół na poziomie kodu maszynowego.
Nigdy nie widziałem czegoś do zrobienia (prawda). Jest to nieskończona pętla, ale idiomatyczny (i wyraźny) sposób na zapisanie go, jeśli "dla (;;)". –