4.13. Instructiunea goto

2019/02/18 in Programare in C

Instructiunea goto nu este o instructiune absolut necesara in scrierea programelor in limbajul C. Ea se dovedeste insa utila in anumite cazuri. Autorii limbajului recomnda utilizarea ei in cazul in care se doreste sa se iasa din mai multe cicluri imbricate. Astfel de situatii apar adesea la intalnirea unei erori. In aceste cazuri se doreste sa se faca un salt in afara ciclurilor in care a intervenit eroarea, pentru a se ajunge la o secventa externa lor de tratare a erorii respective.

Inainte de a indica formatul instructiunii goto trebuie precizata notiunea de eticheta.

Prin eticheta intelegem un nume urmat de doua puncte:

nume:

Aici nume reprezinta numele etichetei respective.

Dupa o eticheta urmeaza o instructiune.

Se spune ca o eticheta prefixeaza instructiunea care urmeaza dupa ea.

Etichetele sunt locale in corpul functiei in care sunt definite.

Instructiunea goto are formatul:

goto nume;

unde:

nume este numele unei etichete definita in corpul aceleiasi functii in care se afla instructiunea goto.

La intalnirea instructiunii goto se realizeaza un salt la instructiunea prefixata de eticheta al carui nume se afla dupa cuvantul cheie goto.

Deoarece o eticheta este locala in corpul unei functii rezulta ca ea este nedefinita in afara corpului functiei respective. In felul acesta, o instructiune goto poate realiza un salt numai la o instructiune din corpul aceleiasi functii in care este utilizata.

Deci, o instructiune goto nu poate face salt din corpul unei functii la o instructiune din corpul altei functii.

Nu se justifica folosirea abuziva a acestei instructiuni. Ea este recomandata pentru a simplifica iesirea din cicluri imbricate.

Exemplu:

Presupunem ca intr-un punct al programului, aflat in interiorul mai multor cicluri, se depisteaza o eroare si se doreste sa se continue executia programului cu o secventa de tratare a erorii respective. In acest caz, vom folosi o instructiune goto ca mai jos:

for(...) {
...
 while() {
  ...
  do {
   ...
   for(...) {
    ...
    if (1 == 0)
     goto divzero;
    else
     x = y / i;
     ...
   }
   ...
  } while (...);
  ...
 }
 ...
}
...
/* secventa de tratatre a erorii */
divzero:
 printf (...);
 ...

In absenta instructiunii goto se poate realiza acelasi lucru folosind un indicator si o serie de teste realizate asupra lui.

4.14. Programare procedurala, functii, apelul si revenirea din ele