2013-02-18 42 views
7

Wiele razy w przykładach programów C natknąłem się na tego rodzaju pętle. Co tak naprawdę robią tego rodzaju pętle?Proste wykonywanie pętli przy użyciu while (true);

do { 

    while (...) // Check some condition if it is true. 
    { 
     calculation 1 
    } 

    // Some new condition is checked. 

} while(true); 

Co jest potrzeba while(true); Służy do nieskończonej pętli? Czy ktoś może wyjaśnić, co naprawdę robi powyższa pętla. Jestem nowy programowania C

+3

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 (;;)". –

Odpowiedz

1

tak to jest wykorzystywane do nieskończonej pętli, w tym przypadku najlepszym rozwiązaniem jest, aby wyrwać się z wyglądem na warunku

do { 

    while() //check some condition if it is true 
    { 
    calculation 1 
    } 

    //some new condition is checked,if condition met then break out of loop 


    } while(true); 
0

W C wszystkich pętli while warunek jest prawdziwy. Tak więc jednoznaczne true w warunku naprawdę oznacza "pętla, podczas gdy true jest prawdą", a więc na zawsze pętle.

+1

W 'for (;;)' gdzie lub co jest warunkiem? :-) – Jens

+0

@ Jens Mam tylko dostęp do specyfikacji C++ 11, ale mówi się, że pętla 'for' jest odpowiednikiem pętli' while', a sekcja 2 sekcji 6.5.3 mówi "Brakuje warunku domniemana klauzula 'while' równoważna' while (true) '" –

+1

@ Jens w 6.8.5.3 (2): "Pominięty _expression-2_ jest zastępowany przez stałą niezerową ", gdzie _expression-2_ jest warunkiem pętli. A więc warunek jest wstawiony domyślnie, jeśli go nie napiszesz (ale oczywiście pod regułą as-if, często otrzymujesz skok bezwarunkowy). –

0

Ta pętla jest nieskończona i jeśli to, co twój program kiedykolwiek zakończył z takim lopem, musisz mieć albo instrukcję break albo return (lub w niektórych przypadkach wyrzucić wyjątek) pod podanym warunkiem w takiej pętli, w przeciwnym razie taki program będzie nigdy się nie kończ.

+0

Lub użyj 'goto' ... –

0

Nieskończona pętla jest przydatna, gdy sprawdzenie warunku zatrzymania nie może być zrobione z przodu (jak for i while), ani z tyłu (jak do{}while). Zamiast tego po prostu zapętlisz na zawsze i w środku kodu możesz sprawdzić warunek i złamać: if(something) break;.

0

czasami używamy go na przykład:

do 
    recv(s , &buf, len, flags); 
while(true) 

przykład z okien winsock API, w ten sposób można słuchać od portu.

0
do { 
    // code here 
} while(true); 

Pętla ta działa w nieskończoność i może doprowadzić do erulr środowiska wykonawczego, jeśli nie zostanie zatrzymana. Jeśli robisz tego rodzaju pętlę, upewnij się, że zawiera instrukcję break, aby upewnić się, że twoja pętla zostanie zatrzymana w pewnym momencie.

podobne do tego

if(condition) 
    break; 

Jeśli program osiągnął pewien punkt, w którym warunek jest spełniony, to automatycznie zakończyć do-while i przejść do kodu po tym.

0

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.

3

Te pętle są używane, gdy chce się zapętlić na zawsze, a warunek zerwania z pętli nie jest znany. Warunki certyfikatu są ustawiane wewnątrz pętli razem z instrukcjami break lub return, aby wyjść z pętli. Na przykład:

while(true){ 
    //run this code 
    if(condition satisfies) 
     break; //return; 
} 

Pętle te są tak samo jak każdy inny, gdy pętla z warunkiem, aby zatrzymać pętla jest w ciele pętli while inaczej to będzie działać wiecznie (który nigdy nie jest intencją części kod do momentu, aż to konieczne). To zależy od logiki programisty tylko to, co on/ona chce zrobić.