Ile razy zostanie wykonana pętla zapisana w przedstawionym skrypcie PHP?
$a = $x = 0; do { $a++; $x = $x + $a; } while ($x != 21);
A. 6
B. 5
C. 7
D. 0
Pytanie z egzaminu CKE, czerwiec 2019 (arkusz E.14-X-19.06).
W tej pętli kluczowe jest to, że konstrukcja do...while w PHP zawsze wykona ciało pętli przynajmniej jeden raz, a dopiero potem sprawdzi warunek. Na początku zmienne a i x mają wartość 0. W każdej iteracji najpierw zwiększana jest zmienna a o 1, a potem jej aktualna wartość jest dodawana do x. Czyli dostajemy kolejno: po 1. obiegu a = 1 i x = 1, po 2. obiegu x = 3, po 3. x = 6, po 4. x = 10, po 5. x = 15, po 6. x = 21. Dopiero wtedy warunek x != 21 staje się fałszywy, więc pętla się kończy. Dlatego wykona się dokładnie 6 razy. Moim zdaniem to dobry przykład, bo pokazuje praktyczne znaczenie kolejności operacji w pętli. W realnym kodzie PHP takie liczenie może pojawić się np. przy sumowaniu wartości, generowaniu numerów, obliczaniu progów punktowych albo kontrolowaniu liczby powtórzeń. Dobrą praktyką jest też pilnowanie, czy warunek zakończenia na pewno kiedyś zostanie spełniony, bo inaczej bardzo łatwo zrobić pętlę nieskończoną. W PHP warto dodatkowo pamiętać, że operator != porównuje wartości z możliwą konwersją typów; gdy zależy nam także na typie, częściej używa się !==.
Tutaj łatwo się pomylić, bo zapis do...while wygląda podobnie do zwykłego while, ale działa trochę inaczej. W klasycznej pętli while warunek jest sprawdzany przed wejściem do bloku, natomiast w do...while blok kodu wykonuje się najpierw, a dopiero później następuje sprawdzenie warunku. Z tego powodu wynik 0 nie może być poprawny, bo nawet gdyby warunek od razu był fałszywy, ciało pętli i tak zostałoby uruchomione jeden raz. To jest taka podstawowa własność tej konstrukcji i w PHP działa właśnie w ten sposób. Wynik 5 zwykle bierze się z zatrzymania liczenia na wartości x = 15 albo z pominięcia ostatniego obiegu, w którym x dopiero dochodzi do 21. A to właśnie ten obieg jeszcze się wykonuje, bo warunek jest sprawdzany po dodaniu wartości a do x. Z kolei wynik 7 oznaczałby, że pętla wykonała się jeszcze raz po osiągnięciu x = 21, ale tak się nie dzieje. Po szóstym obiegu warunek x != 21 daje fałsz, więc interpreter kończy pętlę i nie wraca już do jej początku. W praktyce dobrze jest rozpisać sobie tabelkę wartości zmiennych po każdym przejściu pętli, zwłaszcza na egzaminie albo podczas debugowania. Z mojego doświadczenia to najprostsza metoda, bo od razu widać, kiedy zmienna sterująca albo suma osiąga wartość końcową. Trzeba też uważać na typowy błąd myślowy: nie sprawdzamy warunku „w środku” pętli po każdej linijce, tylko dokładnie w miejscu określonym przez składnię języka, czyli po całym bloku do.