8.11 Instrukcje skoku

Wykonanie instrukcji skoku przenosi sterowanie w inne miejsce programu. Ma ona postać

       goto etykieta;
gdzie etykieta jest etykietą pewnej instrukcji wewnątrz tej samej funkcji. Sterowanie zostanie przeniesione właśnie do tej instrukcji.

W zasadzie język dopuszcza najdziwniejsze skoki, ale należy unikać skoków do wnętrza instrukcji złożonych (choć formalnie takie skoki są legalne, jeśli tylko nie omijają deklaracji z inicjatorami). Najczęściej używa się instrukcji goto aby wyjść z wnętrza zagnieżdżonych pętli, jak w następującym programie:


P55: oceny.cpp     Instukcja skoku

      1.  #include <iostream>
      2.  using namespace std;
      3.  
      4.  int main() {
      5.      const int st_size = 7;
      6.  
      7.      int oceny[][st_size] = { { 5, 4, 3, 3, 3, 4, 4 },
      8.                               { 5, 3, 3, 3, 4, 2, 3 },
      9.                               { 4, 4, 4, 4, 3, 3, 5 } };
     10.  
     11.      int gr_size = sizeof(oceny)/sizeof(oceny[0]);
     12.  
     13.      bool jestDwoja = false;
     14.  
     15.      for (int grupa = 0; grupa < gr_size; grupa++)  
     16.          for (int student = 0; student < st_size; student++)
     17.              if ( oceny[grupa][student] == 2 ) {
     18.                  jestDwoja = true;
     19.                  goto KONIEC;
     20.              }
     21.  KONIEC:                                            
     22.      if (jestDwoja) cout << "Byla dwojka"   << endl;
     23.      else           cout << "Nie ma dwojki" << endl;
     24.  }

W zagnieżdżonej pętli rozpoczynającej się w linii  szukamy oceny niedostatecznej w dwuwymiarowej tablicy ocen indeksowanej numerem grupy i numerem studenta. Ponieważ interesuje nas tylko, czy jest choć jedna ocena niedostateczna, w momencie, gdy taką znajdziemy, chcemy wyjść z obu pętli. Zauważmy, że instrukcja break przerwałaby tylko pętlę wewnętrzną; pętla po grupach byłaby kontynuowana. Dlatego użyliśmy instrukcji goto, która „wyrzuca” nas od razu z obu pętli aż do linii .

T.R. Werner, 21 lutego 2016; 20:17