• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pętle typu while(true) w programowaniu

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
236 wizyt
pytanie zadane 8 marca w C i C++ przez whiteman808 Gaduła (4,720 p.)
Czy używanie nieskończonych pętli while (true), for (;;) to zła praktyka programistyczna? Pytam bo zastanawiam się nad przepisaniem kodu C++ w taki sposób by uniknąć niepotrzebnych deklaracji zmiennych i zrobić po prostu returna w odpowiednim ifie.
komentarz 8 marca przez Oscar Nałogowiec (29,360 p.)
Nie bardzo widzę związek jednego z drugim.

Takie dziwne while czasami występują w makrach (#define) by w każdym kontekscie takie makro działało jako jedna instrukcja.
komentarz 9 marca przez Wiciorny Ekspert (281,250 p.)

@whiteman808, na niejednej produkcji widziałem XD 

komentarz 10 marca przez Yolo Nowicjusz (160 p.)

@whiteman808, Kiedy nieskończona pętla jest dobrym rozwiązaniem?                                       

Główna pętla programu lub serwera

Jeśli masz program działający w trybie ciągłym (np. serwer, system obsługi zdarzeń), pętla nieskończona to naturalne rozwiązanie:

while (true) { handleRequests(); }

Przykłady: pętle gier, serwery HTTP, systemy czasu rzeczywistego.

Pętle obsługujące zdarzenia (event loop)

while (true) {

    Event event = getNextEvent();

    if (event == QUIT) break;

    processEvent(event);

}

Przykłady: systemy operacyjne, GUI, game loop.

Makra i metaprogramowanie

W niektórych bibliotekach (np. w makrach preprocesora #define) nieskończone pętle są używane, aby zachować jednolitą strukturę kodu.

Kiedy unikać nieskończonych pętli?

Brak warunku wyjścia

Jeśli nie masz jasnego sposobu na przerwanie pętli, łatwo stworzyć zawieszenie programu (np. while (true) {} bez break).

Niepotrzebna alokacja CPU

Problem: Pusta pętla będzie zjadać 100% CPU:

while (true) {}  // Źle!
Rozwiązanie: Użycie sleep lub mechanizmu obsługi zdarzeń:

while (true) { std::this_thread::sleep_for(std::chrono::milliseconds(100)); }

Zastępowanie warunkowych pętli (while lub for)

Lepsze podejście:

while (condition) {
    doSomething();
}
Złe podejście:

while (true) {
    doSomething();
    if (!condition) break;
}

Czy warto zamieniać pętlę na return w if?

Jeśli Twoja pętla ma jeden warunek kończący, można użyć return, ale zależy od kontekstu.

Przykład: while (true) vs. return

Podejście z while (true):


void run() {


    while (true) {


        int x;


        std::cin >> x;


        if (x == 0) break;

        std::cout << "Liczba: " << x << "\n";

    }

}

Podejście z return:

void run() {

    while (true) {

        int x;

        std::cin >> x;

        if (x == 0) return;

        std::cout << "Liczba: " << x << "\n";

    }

}

W tym przypadku return upraszcza kod, bo nie musimy robić break, ale nie zawsze jest to najlepsze rozwiązanie.

 Nieskończona pętla jest OK, jeśli wiesz, jak ją przerwać (break, return, sleep).

Używaj while (true) tylko tam, gdzie to logiczne (pętle zdarzeń, serwery, gry).

 Zamiast while (true), lepiej używać while (condition), jeśli warunek jest znany wcześniej.

 Jeśli chcesz uprościć kod, return zamiast break może być dobrym wyborem, ale nie zawsze.

komentarz 11 marca przez Oscar Nałogowiec (29,360 p.)
Takie pętle są też często stosowane w sterownikach różnych urządzeń, czyli w systemach embedded - program sterujący telewizorem lub pralką się nie kończy. Najwyżej się wyłacza zasilanie.

W wielu zacytowanych kodach - przede wszystkim należy właściwie wybrać rodzaj pętli. Skoro pętla ma się wykonać co najmniej raz, zamiast while () {}, bardziej stosowna będzie pętla do {} while (). Takie przerywanie pętli w środku (bądź co bądź naruszenie zasad programowania strukturalnego) należy zostawić na sytuacje awaryjne i wyjątkowe - raczej nie powinna to być normalna ścieżka wykonania programu. W C++ pętle można też przecież przerwać wyjątkiem - standardowym lub własnym.

1 odpowiedź

+1 głos
odpowiedź 8 marca przez adrian17 Mentor (354,120 p.)

Nie, są jak najbardziej dobre jeśli to najprostszy sposób zapisania logiki którą chcesz osiągnąć.

w taki sposób by uniknąć niepotrzebnych deklaracji zmiennych

To znaczy? W jaki sposób są niepotrzebne?

komentarz 8 marca przez whiteman808 Gaduła (4,720 p.)
Zrobić while(true) zamiast sprawdzania bool success w warunku pętli
komentarz 9 marca przez adrian17 Mentor (354,120 p.)

Jeśli masz na myśli zastąpienie

while (good) {
   ...
   if (costam)
        good = false;
}

przez

while (true) {
   ...
   if (costam)
        break;
}

To tak, to jest jak najbardziej OK.

Podobne pytania

0 głosów
3 odpowiedzi 2,017 wizyt
pytanie zadane 11 października 2018 w C i C++ przez Vitall Początkujący (400 p.)
0 głosów
1 odpowiedź 809 wizyt
pytanie zadane 16 maja 2018 w PHP przez intoksynator Gaduła (3,450 p.)
+1 głos
1 odpowiedź 248 wizyt
pytanie zadane 22 stycznia 2022 w PHP przez kubekszklany Gaduła (3,250 p.)

93,434 zapytań

142,429 odpowiedzi

322,661 komentarzy

62,797 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...