W moich czasach C / C ++ kodując „nieskończoną pętlę” jako
while (true)
czułem się bardziej naturalnie i wydawał mi się bardziej oczywisty niż
for (;;)
Spotkanie z PC-lint pod koniec lat 80-tych i późniejsze dyskusje na temat najlepszych praktyk wyrwały mnie z tego nawyku. Od tego czasu kodowałem pętle za for
pomocą instrukcji sterującej. Dzisiaj, po raz pierwszy od dłuższego czasu, i być może moja pierwsza potrzeba nieskończonej pętli jako programista C #, mam taką samą sytuację. Czy jeden z nich jest poprawny, a drugi nie?
c#
infinite-loop
Bob Kaufman
źródło
źródło
while(true)
wymaga warunku.for(;;)
jest zatem lepszą reprezentacją nieskończonych pętli, które powtarzają się bezwarunkowo. 2. Stare, nieoptymalizujące kompilatory mogły faktycznie oceniać(true)
pętlę. 3. C to minimalistyczny język z czasów teletypów, terminali 300 bodów i jednoznakowych nazw zmiennych. W środowisku, w którym liczy się każde naciśnięcie klawisza,for(;;)
jest nieco krótszy niżwhile(true)
.Odpowiedzi:
Jest zawsze tym, czego używałem i widziałem, jak inni używają pętli, która musi zostać przerwana ręcznie.
źródło
Kompilator C # przekształci oba
i
w
CIL dla obu jest taki sam. Większość ludzi uważa
while(true)
za łatwiejsze do odczytania i zrozumienia.for(;;)
jest raczej tajemniczy.Źródło:
Zepsułem trochę więcej z .NET Reflector i skompilowałem obie pętle z włączoną opcją „Optimize Code” w Visual Studio.
Obie pętle kompilują się do (z .NET Reflector):
Wkrótce powinny zaatakować drapieżniki.
źródło
goto
instrukcją, przy okazji, co nie jest zaskoczeniem.goto LOOP
jest poprawna nieskończona pętla C # :)Myślę, że to może być łatwiejsze do odczytania i jest zdecydowanie standardem do użycia w C #:
źródło
while(1)
nie jest prawidłowy w C #, ponieważ1
nie jestbool
.Dysz, użyj:
LUB, jak zauważył jsight , możesz być podwójnie pewien:
Zanim ludzie na mnie krzyczą, to ten sam kod CIL, sprawdziłem :)
źródło
Aby powtórzyć kilka starych dowcipów:
for (;;) {}
” - to sprawia, że stwierdzenie płacze.#define EVER ;;
".źródło
#define ever (;;)
który moim zdaniem jest bardziej czytelny.for ever {}
#define forever while(true)
Jeśli chcesz przejść do starej szkoły, goto jest nadal obsługiwane w C #:
Aby uzyskać naprawdę nieskończoną pętlę, jest to polecenie główne. =)
źródło
Myślę, że
while (true)
jest trochę bardziej czytelny.źródło
W sytuacjach, w których potrzebowałem prawdziwej nieskończonej pętli, zawsze używałem
Wydaje się, że lepiej wyraża zamiar niż puste oświadczenie.
źródło
Osobiście zawsze wolałem
for(;;)
właśnie dlatego, że nie ma warunku (w przeciwieństwie do tego,while (true)
który ma zawsze prawdziwy). Jednak jest to naprawdę bardzo drobna kwestia stylu, o którą nie sądzę, aby była warta dyskusji. Nie widziałem jeszcze wytycznych w stylu C #, które nakazują lub zabraniają żadnego z tych podejść.źródło
while
”. Jeśli chodzi o programistę, kompilator przekształca kod wysokiego poziomu w IL. W IL nie mawhile
(lubfor
) pętli, są tylko etykiety i gotowe.Osobiście wolę
for (;;)
idiom (z punktu widzenia C / C ++). Chociaż zgadzam się, żewhile (true)
jest w pewnym sensie bardziej czytelny (i to jest to, czego używałem, nawet w C / C ++), zwróciłem się do używaniafor
idiomu, ponieważ:Myślę, że fakt, że pętla się nie kończy (w normalny sposób) jest warty „wywołania” i myślę, że
for (;;)
robi to trochę więcej.źródło
for
wwhile
. Dla obufor (;;){}
iwhile (true){}
generuje nowywhile(true){}
kod. Zobacz tę odpowiedź .Zalecana jest oryginalna książka K&R dla C, z której C # może prześledzić swoje pochodzenie
dla nieskończonych pętli. Jest jednoznaczny, łatwy do odczytania i ma długą i szlachetną historię.
Dodatek (luty 2017 r.)
Oczywiście, jeśli uważasz, że ta zapętlona forma (lub jakakolwiek inna forma) jest zbyt tajemnicza, zawsze możesz po prostu dodać komentarz .
Lub:
źródło
Powinno być
while(true)
niewhile(1)
takwhile(1)
jest nieprawidłowy w C #, tak;)źródło
Alternatywnie można powiedzieć, że posiadanie nieskończonej pętli i tak jest zwykle złą praktyką, ponieważ wymaga warunku wyjścia, chyba że aplikacja naprawdę działa wiecznie. Jeśli jednak dotyczy to pocisku manewrującego, zaakceptuję wyraźny warunek wyjścia, który może nie być wymagany.
Chociaż podoba mi się ten:
źródło
f < 16777217f
jest zawszefalse
... więc to nigdy się nie zapętla.Wolę nieco bardziej „piśmienny” kod. O wiele bardziej prawdopodobne jest, że zrobię coś takiego w praktyce:
źródło
do ... while()
pętla w przebraniu. To zajęło mi tylko kilka sekund. Gdybyś napisałdo ... while()
pętlę, byłby natychmiast jasny. -1break
.Nawet ja też mówię, że ten poniżej jest lepszy :)
źródło
Jeśli grasz w golfa kodowego, proponuję
for(;;)
. Poza tymwhile(true)
ma to samo znaczenie i wydaje się bardziej intuicyjny. W każdym razie większość programistów prawdopodobnie zrozumie obie odmiany, więc nie ma to większego znaczenia. Użyj tego, co najwygodniejsze.źródło
Pod względem czytelności kodu
while(true)
w jakimkolwiek języku, który uważam, ma większy sens. Jeśli chodzi o to, jak widzi to komputer, w dzisiejszym społeczeństwie nie powinno być żadnej różnicy między bardzo wydajnymi kompilatorami i interpreterami.Jeśli jest jakaś różnica w wydajności, jestem pewien, że tłumaczenie na MSIL zostanie zoptymalizowane. Możesz to sprawdzić, gdybyś naprawdę chciał.
źródło
Jedynym powodem, dla którego mógłbym powiedzieć,
for(;;)
są ograniczenia CodeDom (podczas gdy pętli nie można deklarować za pomocą CodeDom, a pętle for są postrzegane jako bardziej ogólna forma jako pętla iteracyjna).Jest to dość luźny powód, aby wybrać ten inny niż fakt, że
for
implementacja pętli może być używana zarówno dla normalnego kodu, jak i kodu wygenerowanego przez CodeDom. Oznacza to, że może być bardziej standardowy.Uwaga: możesz użyć fragmentów kodu, aby utworzyć
while
pętlę, ale cała pętla musiałaby być fragmentem ...źródło
Oba pełnią tę samą funkcję, ale ludzie generalnie wolą
while(true)
. To łatwe do odczytania i zrozumienia ...źródło
Każde wyrażenie, które zawsze zwraca wartość true, powinno być OK dla pętli while.
Przykład:
źródło