Linux E X P R E S

Facebook

Programovanie v jazyku C++: Príkaz goto

cplusplus.png

Minule sme riešili príkazy break a continue. V tomto článku pokračujeme ďalším zo základných príkazov jazyka C++: príkazom goto.


Príkaz goto

Minule ste sa dozvedeli, že s pomocou príkazu break viete rýchlo opustiť aktívny cyklus. Teraz si ale predstavíme podobný príkaz, ktorý nám skočí tam, kam chceme. Bude reč o príkaze goto. Práve tento príkaz nám zabezpečí, že môžeme opustiť cyklus a v definovanom odkaze môže program pokračovať.

1. príklad: Učíme sa príkaz goto

#include <iostream>   // hlavičkový súbor
using namespace std;   // priestor mien
int main()   // hlavná funkcia
{
    cout << "Idem pocitat od 0 do 9! Ale cinkni mi prikazom goto, ze mam skoncit!\n";
    for (int i = 0; i < 1000; i++)   // cyklus
    {
        cout << "Pocitam: "<<i<<"\n";
        if (i >= 9)
            goto skonci;   // využívame príkaz goto
    }
    skonci:   // štítok, odkaz na ktorý sa odvoláva príkaz goto
        cout<<"A padla! Hurra!";
}

Výsledok programu:

Idem pocitat od 0 do 9! Ale cinkni mi prikazom goto, ze mam skoncit!
 Pocitam: 0
 Pocitam: 1
 Pocitam: 2
 Pocitam: 3
 Pocitam: 4
 Pocitam: 5
 Pocitam: 6
 Pocitam: 7
 Pocitam: 8
 Pocitam: 9
 A padla! Hurra!

Rozbor programu: Príkaz goto sa uskutoční vtedy, ak premenná i bude mať hodnotu 9. Čo sa stane? Skok na definovanú oblasť, ktorú sme definovali. V našom prípade je to oblasť skonci. Danú oblasť alebo inak povedané aj štítok alebo odkaz, sme definovali takto: skonci: . Týmto sa začne vykonávať postupnosť príkazov, ktorá je definovaná za odkazom.

No fajn, poďme si to skomplikovať.

2. príklad:

#include <iostream>
 
 using namespace std;
 
 int main()
 {
     for (int i = 1; i < 6; i++)
     {
         cout <<i<<" + "<<i<<" je: "<<i+i<<"\n";
         if (i >= 5)
             goto odcitaj;
     }
 
     vydel:   cout << "\n";
              cout <<"1"<<" / "<<"1"<<" je: "<<1/1<<"\n";
              cout <<"2"<<" / "<<"2"<<" je: "<<2/2<<"\n";
              cout <<"3"<<" / "<<"3"<<" je: "<<3/3<<"\n";
              cout <<"4"<<" / "<<"4"<<" je: "<<4/4<<"\n";
              cout <<"5"<<" / "<<"5"<<" je: "<<5/5<<"\n";
 
              goto koniec;
 
     odcitaj: cout << "\n";
              cout <<"1"<<" - "<<"1"<<" je: "<<1-1<<"\n";
              cout <<"2"<<" - "<<"2"<<" je: "<<2-2<<"\n";
              cout <<"3"<<" - "<<"3"<<" je: "<<3-3<<"\n";
              cout <<"4"<<" - "<<"4"<<" je: "<<4-4<<"\n";
              cout <<"5"<<" - "<<"5"<<" je: "<<5-5<<"\n";
 
              goto vynasob;
 
     vynasob: cout << "\n";
 
              for (int i = 1; i < 6; i++)
              {
                 cout <<i<<" * "<<i<<" je: "<<i*i<<"\n";
                 if (i >= 5)
                     goto vydel;
              }
 
     koniec: return 0;
 }

Výsledok programu:

1 + 1 je: 2
 2 + 2 je: 4
 3 + 3 je: 6
 4 + 4 je: 8
 5 + 5 je: 10
1 - 1 je: 0
 2 - 2 je: 0
 3 - 3 je: 0
 4 - 4 je: 0
 5 - 5 je: 0
1 * 1 je: 1
 2 * 2 je: 4
 3 * 3 je: 9
 4 * 4 je: 16
 5 * 5 je: 25
1 / 1 je: 1
 2 / 2 je: 1
 3 / 3 je: 1
 4 / 4 je: 1
 5 / 5 je: 1

Rozbor programu: Využili sme v programe viacero skokov. Ako vidíte, skoky nie sú limitované na zhora dole architektúru, ako v klasickom behu programu. To znamená, že časť programu, ktorý je dole v programe, avšak vyvolaný skok sa môže nachádzať kľudne na začiatku programu. No, ale nie vo všetkom je taká idylka. Čo by sa stalo, ak by sme nedali skok koniec v častí vydel?



3. program: Modifikácia druhého programu: 

#include <iostream>
 
 using namespace std;
 
 int main()
 {
     for (int i = 1; i < 6; i++)
     {
         cout <<i<<" + "<<i<<" je: "<<i+i<<"\n";
 
         if (i >= 5)
             goto odcitaj;
     }
 
     vydel:   cout << "\n";
              cout <<"1"<<" / "<<"1"<<" je: "<<1/1<<"\n";
              cout <<"2"<<" / "<<"2"<<" je: "<<2/2<<"\n";
              cout <<"3"<<" / "<<"3"<<" je: "<<3/3<<"\n";
              cout <<"4"<<" / "<<"4"<<" je: "<<4/4<<"\n";
              cout <<"5"<<" / "<<"5"<<" je: "<<5/5<<"\n";
 
     odcitaj: cout << "\n";
              cout <<"1"<<" - "<<"1"<<" je: "<<1-1<<"\n";
              cout <<"2"<<" - "<<"2"<<" je: "<<2-2<<"\n";
              cout <<"3"<<" - "<<"3"<<" je: "<<3-3<<"\n";
              cout <<"4"<<" - "<<"4"<<" je: "<<4-4<<"\n";
              cout <<"5"<<" - "<<"5"<<" je: "<<5-5<<"\n";
 
              goto vynasob;
 
     vynasob: cout << "\n";
 
              for (int i = 1; i < 6; i++)
              {
                 cout <<i<<" * "<<i<<" je: "<<i*i<<"\n";
 
                 if (i >= 5)
                     goto vydel;
              }
 }

Výsledok programu: Nikdy nekončiaci program.

Rozbor programu: Keďže sme nedefinovali koniec programu, tak po dokončení častí vydel program pokračuje typický zhora na dol a tak sa uzavrie do nekonečnej slučky.

No a nakoniec, ak neholdujete cyklom ako for, while alebo mutácie whilu ako do-while, tak vám môže napomôcť príkaz goto. Ale popravde, využívať goto ako cyklus je zbytočný luxus. Ale ako zaujímavosť si ukážme cyklus v podaní goto.

4. program: Cyklus v podaní príkazu goto. 

#include <iostream>
 
 using namespace std;
 
 int main()
 {
     int i = 0;
 
     vynasob:
         i++;
 
         cout <<i<<" + "<<i<<" je: "<<i+i<<"\n";
 
         if(i >= 5)
             goto theEndKonecneJuj;
 
         goto vynasob;   // goto ako cyklus
 
     theEndKonecneJuj: return 0;
 }

Výsledok programu: 

1 + 1 je: 2
2 + 2 je: 4
3 + 3 je: 6
4 + 4 je: 8
5 + 5 je: 10

Rozbor programu: Kód programu už dôverne poznáte (ak ste poctivo vyriešili všetky programy v tomto článku). Všimnite si, ako elegantne sme vytvorili z goto cyklus.

Poznámka šéfredaktora: Příkazu goto je dobré se v C++ (i v C, ale tam má jeho použití v některých případech pádné důvody a například v linuxovém jádře se využívá poměrně hojně) vyhnout, pokud to jde – a jde to prakticky vždy. Použití goto totiž znepřehledňuje program a komplikuje pochopení jeho běhu.



Diskuze (10) Nahoru