Według mojego sposobu myślenia pętla for służy do iteracji w znanym lub możliwym do określenia zakresie.
String[] names = //something;
for ( int i = 0; i < names.length; i++ ) { //do stuff }
co jest równoważne (określenie zakresu i na bok) do:
String[] names = //something;
int i = 0;
while (i < names.length )
{
// do stuff
i++;
}
Innymi słowy, for
pętla jest po prostu (bardzo przydatnym) cukrem syntaktycznym dla powszechnie stosowanego while
konstruktu.
Jednak widzę wiele for(;;)
konstrukcji w Internecie, które są funkcjonalnie równoważnewhile(true)
Jakie jest tego uzasadnienie? Dlaczego pętla nieskończona dla jest lepsza niż pętla nieskończona podczas?
// Widziałem nawet podręcznik Java, który w ogóle nie używał pętli while! Prowadząc do takich potwornych konstrukcji, jak:
String input = getInput();
for( ; !inputIsValid(input) ; )
{
//redo;
}
language-agnostic
coding-style
Chris Cudmore
źródło
źródło
while
ifor
tutaj, a pytanie się nie zmieni.while(true)
ifor(;;)
znaczy to samo. Oczywiście masz silną preferencjęwhile
, inni mogą mieć równie silną preferencjęfor
. Nie można powiedzieć, że jedno jest bardziej poprawne niż drugie.for(;;)
zagmatwany. Jest to standardowy idiom C, który udokumentujesz w sekcji 3.5 K&R (2e). Rozumiem, że ci się nie podoba; Ci powinni zrozumieć, że inni wolą oczywiście go (jeszcze nigdy byś go zobaczyć). Może być mniej lub bardziej akceptowalny w językach innych niż C; otagowałeś ten język-agnostyk, który tylko zmniejsza prawdopodobieństwo ostatecznej odpowiedzi. Znów głosowałem za zamknięciem, ponieważ Q nie jest konstruktywne; gdybym się obraził, oznaczałbym jako ofensywne zamiast lub oprócz zamknięcia. To wszystko.wheeeeeeee { ... }
Odpowiedzi:
Jest to pozostałość po starych praktykach programistycznych na PDP-11 (tak, powiedziałem stary ). Kiedyś zapisywał pojedynczą instrukcję, która była przydatna do przyspieszenia działania pętli.
Aby uzyskać dodatkowe informacje, zobacz: http://www.flounder.com/exceptions.htm
źródło
for(;;)
składni jako (ich zdaniem) bardziej bezpośredniego stwierdzenia w zamian nie podano kryteriów wyjścia z pętli.while(1) { }
.niektóre kompilatory dają ostrzeżenie (coś w rodzaju wyrażenia warunkowego jest stałe ) podczas używania,
while( 1 )
alefor( ; ; )
nie ma o czym ostrzegać. Programiści chcą kodu bez ostrzeżeń, więc używają opcji for.źródło
Jest to nawyk nabyty w programowaniu C, w którym nie ma typu boolowskiego. Chociaż (1) byłoby potencjalnie równoważne, ale For (;;) jest często używane, ponieważ pojawia się w K&R, jeśli dobrze pamiętam. Podejrzewam, że gdzieś tam też był powód sprzętowy.
źródło
bo (;;) można odczytać jako „na zawsze”, co niektórzy uważają za bardziej naturalne niż „choć prawdziwe”.
źródło
Wszyscy doświadczeni programiści, o których prosiłem, mogą rozpoznać
for(;;)
szybciej niżwhile(true)
lubwhile(1)
.źródło
for(;;)
14ms szybciej niżwhile(1)
:-)