přejít na obsah přejít na navigaci

Linux E X P R E S

Příspěvky Programovanie v jazyku C++: Príkaz goto

Programovanie v jazyku C++: Príkaz goto
fela 29. 04. 2017, 13:12:43
Odpovědět  Odkaz 
Ad 'Poznámka šéfredaktora': Presne tak, vynúť sa dá vždy, aj keď niekedy je ktomu potrebných viac zanorených cyklov, podmienkové premenné,...
Programovanie v jazyku C++: Príkaz goto
Jiří K. 29. 04. 2017, 15:01:56
Odpovědět  Odkaz 
Při první přednášce Základů programování nám přednášející řekl, že od zkoušky vyrazí každého, kdo "goto" použije. Podle něj neexistuje opodstatněný důvod pro existenci takového příkazu.
Lukáš Jelínek Re: Programovanie v jazyku C++: Príkaz goto
Lukáš Jelínek 29. 04. 2017, 21:48:26
Odpovědět  Odkaz 
V linuxovém jádře se goto poměrně vydatně používá, protože C na rozdíl od C++ neobsahuje výjimky. Typicky v ovladačích může nějaká operace selhat na celé řadě míst a po selhání je potřeba vše uvést do řádného stavu (především uvolnit všechny alokované prostředky, vrátit nastavení zařízení apod.). Pokud se to bude řešit jen vnořenými podmínkami, vznikne tím nepřehledný a špatně spravovatelný kód. Tady je použití goto zcela na místě, vytvoří takovou "cibuli", která zajistí řádný úklid pro jakékoli selhání a zároveň je přehledná.

Je to vidět třeba tady (vybral jsem náhodně jeden zdrojový soubor, podobných je tam spousta): http://lxr.free-electrons.com/source/drivers/char/hw_random/core.c
Vojtěch Trefný Re: Programovanie v jazyku C++: Príkaz goto
Vojtěch Trefný 30. 04. 2017, 14:12:35
Odpovědět  Odkaz 
Ve škole a obzvlášť v předmětech co mají v názvu "základy" nebo "úvod" se napovídá spousta věcí, které nejsou pravda :-)

Fakt ale je, že při programování ve škole těžko někdo narazí na problém, kdy by bylo opodstatněné goto použít, a je celkem rozumné ho studentům zakazovat -- ono goto je takové "lákavé", umožňuje hodně si zjednodušit život (aspoň teda dočasně) a vyhnout se těm "správným ale složitým" postupům.

Jinak tedy v článku jsou spíš ukázky toho, kdy goto skutečně nepoužít a když to někdo udělá (jinde než v ukázce, nejlépe odstrašující) tak by zasloužil zlomit klávesnici :-)

Co tedy rozhodně nedělat:
- Víc labelů v jedné funkci. Když se navíc na každý skáče vícekrát, tak aby si člověk pomalu maloval, co ta funkce vlastně dělá.
- goto v cyklu. Na ukočení cyklu prostě slouží break.
- Skoky "nahoru" ve funkci. Skok "zpátky" strašně znepřehledňuje průběh funkce. Takové goto je obvykle znakem toho, že by se z části kódu měla udělat samostatná funkce.

Obecně bych byl proti jakémukoli goto, které implementuje nějakou "funkcionalitu" -- tedy dělá něco, co nějak souvisí se samotným účelem funkce.

Osobně uznávám jen takové to klasické "goto out;", které už tu zmiňoval Lukáš -- skok na konec funkce, kde se vyřeší return a uvolňování paměti (prostředků obecně) na jednom místě, aby to nebylo třeba řešit v každém ifu.
Programovanie v jazyku C++: Príkaz goto
bobo 23. 06. 2017, 13:02:24
Odpovědět  Odkaz 
Kod, ktory vyhlada prvy nulovy prvok v n-dimenzionalnom (napr. n=3 => 3x vnoreny cyklus) poli je s goto ovela citatelnejsi, ako po kazdom cykle testovat nejaku stavovu premennu.

BTW, assembler bez prikazu goto (JUMP) by ani nemohol existovat.

Aby to bolo jasnejsie: Ak programovaci jazyk goto umoznuje, nie je vhodne ho studentom zakazovat pouzivat, alebo ich zo skusky za pouzitie vyhadzovat, pripadne im "lamat klavesnicu". Kazdy nech sa nauci na vlastnych chybach, ak to mysli s programovanim v C++ vazne. Ked niekto goto nevie pouzivat a robi mu problemy, tak nech ho ani nepouziva a najlepsie ani C++, aby nahodou nezabudol napr. dealokovat pole alebo zavolat destruktor.