content12









Instrukcja goto





W zasadzie na tym moglibyśmy skończyć omawianie instrukcji sterujących, gdyby nie jeszcze jedna, wstydliwa instrukcja goto. Ma ona formę:

goto etykieta ;


Po napotkaniu takiej instrukcji wykonywanie programu przenosi się do miejsca, gdzie jest dana etykieta.


Powiedzmy jasno: używanie instrukcji goto zdradza, że się jest złym programistą. To dlatego, że instrukcji tej zawsze da się uniknąć. Program (nad-) używający instrukcji goto jest dla programisty nieczytelny, a z kolei dla kompilatora stanowi to przeszkodę w eleganckim skompilowaniu.


Z instrukcja goto wiąże się zawsze etykieta, do której należy przeskoczyć. Etykieta jest to nazwa, po której następuje dwukropek.


W języku C++ nie można sobie skoczyć z dowolnego miejsca programu w dowolne inne. Etykieta, do której przeskakujemy, musi leżeć w obowiązującym w danej chwili tzw. zakresie ważności. Oto przykład użycia goto:

cout << "Cos piszemy \n" ;
goto aaa ; // stad przeskok
cout << "Tego nie wypiszemy " ;
aaa: // w to miejsce
cout << "Piszemy " ;


Ten fragment objawi się na ekranie jako:

Cos piszemy
Piszemy


Przypominam, że to, iż w naszym przykładzie etykietę wysunąłem bliżej lewego marginesu, nie ma żadnego znaczenia dla kompilatora. Jemu jest to wszystko jedno.
Nam jednak nie. Dla nas chyba lepiej, by etykieta bardziej rzucała się w oczy, łatwiej ją odszukać w tekście programu.



Mimo tej niesławy są sytuacje, gdy instrukcja goto się przydaje.
Na przykład dla natychmiastowego opuszczenia wielokrotnie zagnieżdżonych pętli. Instrukcją break przerwać możemy przecież tylko tę najbardziej zagnieżdżoną pętlę. Dzięki instrukcji goto możemy w wyjątkowych wypadkach od razu wyskoczyć na zewnątrz. Na zewnątrz - oznacza tu - na zewnątrz tych zagnieżdżonych pętli. (Zawsze jednak tylko w ramach tego bloku programu, w którym znana jest etykieta).


Oto przykład:

int m, i, k ;
while(m < 500)
{
while(i < 20)
{
for (k = 16 ; k < 100 ; k = k+4 )
{
//...........
// tu wyskoczymy !
if(blad_operacji)goto berlin ; // 1
}
}
}

berlin: //etykieta 2
cout << "Po opuszczeniu wszystkich petli " ;

foliogram nr 10


Jeśli w jakiś sposób w trakcie pracy tych pętli zmienna blad_operacji przybierze wartość niezerową, wówczas nastąpi wyskok (1) z pętli, i wykonywane będą instrukcje począwszy od etykiety berlin (2).










Wyszukiwarka

Podobne podstrony:
content
content
content
content
content
content
content
content
content
function domnode get content
content
content
content
content
content
content

więcej podobnych podstron