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.







