Odpowiedzi na ostatnie pytanie dotyczące pętli for(;;){}
(What does a for (;;) loop do) nie były dla mnie odpowiedzią, więc pomyślałem, że spróbuję nieco uściślić pytanie. W szczególności, nie wiedząc, że pętle bez warunkowania są nieskończonymi pętlami, chciałbym wiedzieć, dlaczego są one nieskończonymi pętlami.Dlaczego pętle (;;) zachowują się jak nieskończone pętle?
W oświadczeniu for (;_;){}
, _
jest wyrażeniem warunkowym. Moim pierwszym przypuszczeniem byłoby, że puste wyrażenie może ocenić na 0
lub NULL
. Ale jeśli przetestujesz:
for (;;){}
to nieskończona pętla, jak wszyscy zauważyli.
for (;1;){}
to nieskończona pętla.
Ale żaden z tych organów pętli wykonać w ogóle:
for (;0;){}
for (;NULL;){}
Zatem pusty wyrażenie warunkowe nie wydaje się, aby ocenić albo 0
lub NULL
.
Moje pytanie brzmi: czy zachowanie pętli for (;;){}
jest artefaktem sposobu, w jaki C ocenia wyrażenia, czy jest to tylko specjalny przypadek zdefiniowany w ramach implementacji, ponieważ ciało pętli, które nigdy nie jest wykonywane, nie jest zbyt użyteczne?
UPDATE: Po przeczytaniu komentarzy i odpowiedzi, zdaję sobie sprawę, że moje pytanie nie było tak jasno sformułowane, jak mogło być. Przypuszczam, że pytanie było dwojakie:
jest zachowanie
for(;;){}
pętli ściśle wynikiem sposób, że C ocenia wyrażeń w ogóle, czy to zachowanie charakterystyczne dla sposobu, w jaki C oceniafor
oświadczenia? Okazuje się, że druga z tych alternatyw ma miejsce, a po dalszej refleksji ma to sens. Zwykle brakujące wyrażenie uruchamia błąd kompilatora. Na przykładwhile(){}
nie będzie się kompilował.Dlaczego to zachowanie zostało wybrane dla pętli
for
bez wyrażeń warunkowych? Początkowo sugerowałem, że po prostu nie jest bardzo przydatna pętlafor
z ciałem, która nigdy nie zostanie wykonana. Ale zdaję sobie sprawę, że jeśli błędnie opuścisz warunkowe z oświadczeniafor
, zgodnie z zasadami standardu, twój program prawdopodobnie ulegnie awarii w nieskończonej pętli. To może być zaskakujące, ale przynajmniej wiesz, gdzie się rozbił. Ale jeśli alternatywne zachowanie było regułą, twój program pomijałby ciałofor
, prawdopodobnie prowadząc do jakichś bardzo nieprzyjemnych niespodzianek, które-zna-gdzie. Zatem, stosując zasadę najmniejszego zaskoczenia, zachowanie w nieskończonej pętli jest bardziej pożądane. Jak zauważył @martin, jest to po prostu rozsądna wartość domyślna dla pętlifor
.
Dziękuję wszystkim za komentarze i odpowiedzi oraz za pomoc w wyjaśnieniu sobie mojego pytania.
Czy możesz wymyślić bardziej opisowy tytuł pytania? Idealnie byłoby, gdyby tytuł pomógł innym osobom w tej samej kwestii dotrzeć do nas w przyszłości. –
Komentarz do targów, @matt - Zmieniłem tytuł. Czy to jest bardziej przydatne? –
"Moim pierwszym przypuszczeniem byłoby, że puste wyrażenie może ocenić wartość" 0 "lub" NULL "- dlaczego? Ani C, ani C++ nie mają pojęcia "puste wyrażenie". Co od razu oznacza, że pusta przestrzeń zamiast warunku "for" wymaga specjalnej obróbki, którą podaje się w specyfikacji zachowania 'for'. – AnT