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.