3 STEROWANIE
Czasami wygodnie jest mieć możliwość kontrolowanego opuszczenia pętli w inny sposób niż przez sprawdzenie warunku na początku lub na końcu pętli. Instrukcja break pozwala na wcześniejsze opuszczenie pętli for, while i do tak samo, jak instrukcji switch. Instrukcja ta powoduje natychmiastowy wyskok z najbardziej zagnieżdżonej pętli lub instrukcji switch, w której występuje.
Następująca funkcja trim usuwa znaki odstępu, tabulacji i nowego wiersza występujące na końcu tekstu, wykorzystując instrukcję break do opuszczenia pętli po wy. kryciu pierwszego od końca znaku różnego od odstępu, znaku tabulacji i nowego wiersza.
/* trim: usuń z s końcowe znaki odstępu, tabulacji, nowego wiersza */ int trim(char sf ])
{
int n;
for (n = strlen(s)-1; n >= 0; n—)
if (s[n] !=’’&& s[n] != ’\f && s|nl != ’\n’) break; s[n+1] = ’\0’; return n;
Funkcja strlen zwraca długość tekstu. Pętla for rozpoczyna działanie od ostatniego znaku tekstu i - posuwając się wstecz - kolejno bada każdy znak szukając pierwszego, który nie jest znakiem odstępu, tabulacji i nowego wiersza. Pętlę przerywa się pc wykryciu takiego znaku lub wtedy, kiedy n stanie się ujemne (co oznacza, że przebadano cały tekst). Sprawdź, że algorytm jest poprawny nawet wówczas, gdy tekst je$ pusty lub zawiera jedynie białe znaki.
Instrukcja continue jest spokrewniona z break, ale stosuje się ją rzadziej; powoduj przerwanie bieżącego i wykonanie od początku następnego kroku zawierającej ją pęd for, while lub do. Dla pętli while i do oznacza to natychmiastowe sprawdzenie warunku zatrzymania, natomiast w pętli for powoduje przekazanie sterowania do częśc przyrostowej. Instrukcja continue dotyczy jedynie pętli; w instrukcji switch nie n* zastosowania. Instrukcja continue występująca wewnątrz pętli w instrukcji switc! powoduje przejście do następnego kroku pętli.
Przykładem może być fragment programu przetwarzającego tylko nieujemne elemer< ty tablicy a; elementy ujemne są pomijane.
for (i = 0; i < n; i++) {
if (afi] < 0) /* pomiń element ujemny */ continue;
/* przetwarzaj element nieujemny */
Instrukcję continue często stosuje się wtedy, gdy następująca po niej część pętli jest tak skomplikowana, że odwrócenie warunku i tworzenie następnego poziomu może zagnieździć program zbyt głęboko.
Język C oferuje „bezgranicznie nadużywaną” instrukcję skoku goto oraz etykiety wskazujące miejsca, do których można skakać. Formalnie instrukcja goto nigdy nie jest konieczna, a w praktyce prawie zawsze można się bez niej obejść. W tej książce dotychczas jej nie używaliśmy.
Niemniej jednak zdarzają się sytuacje, w których instrukcja goto może się przydać. Najczęściej jest ona stosowana do zaniechania przetwarzania w głęboko zagnieżdżonych strukturach programu, na przykład do jednoczesnego przerwania działania dwóch lub więcej pętli. W tym przypadku nie można po prostu użyć instrukcji break, gdyż przerywa tylko jedną z zawierających ją pętli - tę, w której występuje. A więc:
for (...) for (...){
• • •
if (niepowodzenie)
goto error; /* skocz do obsługi błędów */
• • •
error:
/* napraw sytuację lub wypisz komunikat */
Ten schemat jest wygodny wówczas, gdy obsługa błędów nie jest banalna oraz gdy błędy mogą być wykryte w wielu miejscach.
Etykieta ma taką samą postać, jak nazwa zmiennej i jest zakończona dwukropkiem. Etykietę można dołączyć do każdej instrukcji w tej samej funkcji, w której występuje instrukcja goto. Zasięgiem etykiety jest więc cała ta funkcja.
97
7 - Język ANSI C