Použití příkazu GOTO v jazyku C

Použití příkazu GOTO v jazyku C
« kdy: 18. 08. 2019, 09:57:48 »
Zdravím,

použil jste někdy někdo příkaz "goto" v jazyku C v programátorské praxi?


JmJ

  • ****
  • 315
    • Zobrazit profil
Re:Použití příkazu GOTO v jazyku C
« Odpověď #1 kdy: 18. 08. 2019, 10:15:44 »
Ano. I v C++ i v C#.

Kazdopadne rozhodne nejde o beznou vec, ale jsou urcite situace, kde se to hodi. Odhaduju to tak na jeden blok kodu rizeny pres GOTO za 5 let ;-)


Re:Použití příkazu GOTO v jazyku C
« Odpověď #3 kdy: 18. 08. 2019, 21:44:49 »
Citace
použil jste někdy někdo příkaz "goto" v jazyku C v programátorské praxi?
Záleží na stylu programování. Někdy to téměř vyžaduje.
Kód: [Vybrat]
err = a_init();
if (err)
  goto Exit;

err = b_init();
if (err)
  goto a;

err = c_init();
if (err)
  goto b;
. . .
goto Exit;
. . .
c:
  c_finit();
b:
  b_finit();
a:
  a_finit();
Exit:
  return err;
}
A variace na podobné téma (ve Windows kernelu se dalo najít celkem běžně).

Re:Použití příkazu GOTO v jazyku C
« Odpověď #4 kdy: 18. 08. 2019, 22:57:59 »
Goto? Nikdy. A to delam programatora vice jak 20 let.


Re:Použití příkazu GOTO v jazyku C
« Odpověď #5 kdy: 18. 08. 2019, 23:34:34 »
Ano. Na už zmíněný error handling. Víceméně jako náhradu výjimky. Jde asi o jediný celkem akceptovaný scénář pro goto.

Ještě se používá v konečných automatech a parserech, tam ho ovšem typicky nepíšete ručně, ale generujete.

nula

Re:Použití příkazu GOTO v jazyku C
« Odpověď #6 kdy: 19. 08. 2019, 07:46:56 »
Obcas, krome uz zminenych pripadu se hodi na vyskakovani z vicenasobne vnorenych smycek. Nekdy dost hodne. Na tom je obcas pekne poznat nezkuseneho programatora, ktery vyrobi strasne slozity a nepochopitelny bazmek, kde na prvni pohled vubec neni poznat co byl zamer, protoze ve skole se dozvedel, ze goto je zlo a ted ma strach ho pouzit. :)

Re:Použití příkazu GOTO v jazyku C
« Odpověď #7 kdy: 19. 08. 2019, 08:56:31 »
Obcas, krome uz zminenych pripadu se hodi na vyskakovani z vicenasobne vnorenych smycek. Nekdy dost hodne. Na tom je obcas pekne poznat nezkuseneho programatora, ktery vyrobi strasne slozity a nepochopitelny bazmek, kde na prvni pohled vubec neni poznat co byl zamer, protoze ve skole se dozvedel, ze goto je zlo a ted ma strach ho pouzit. :)
Pouziti GOTO mi pripada jako "ted vyskoc z okna" ono to nejak dopadne. Misto: nech toho co delas, vyjdi dverma, zamkni a sejdi ze schodu dolu.

Re:Použití příkazu GOTO v jazyku C
« Odpověď #8 kdy: 19. 08. 2019, 09:22:44 »
Obcas, krome uz zminenych pripadu se hodi na vyskakovani z vicenasobne vnorenych smycek. Nekdy dost hodne. Na tom je obcas pekne poznat nezkuseneho programatora, ktery vyrobi strasne slozity a nepochopitelny bazmek, kde na prvni pohled vubec neni poznat co byl zamer, protoze ve skole se dozvedel, ze goto je zlo a ted ma strach ho pouzit. :)

Tak ono nektere jazyky pro toto maji specialni syntaxi (break: navesti, priapdne break cislo_z_kolika_smycek_vyskocit) aby se nemuselo pouzit to zle skarede goto :-) .

nula

Re:Použití příkazu GOTO v jazyku C
« Odpověď #9 kdy: 19. 08. 2019, 09:28:09 »
Obcas, krome uz zminenych pripadu se hodi na vyskakovani z vicenasobne vnorenych smycek. Nekdy dost hodne. Na tom je obcas pekne poznat nezkuseneho programatora, ktery vyrobi strasne slozity a nepochopitelny bazmek, kde na prvni pohled vubec neni poznat co byl zamer, protoze ve skole se dozvedel, ze goto je zlo a ted ma strach ho pouzit. :)
Pouziti GOTO mi pripada jako "ted vyskoc z okna" ono to nejak dopadne. Misto: nech toho co delas, vyjdi dverma, zamkni a sejdi ze schodu dolu.

To je poradny nesmysl,  C++ (nevim jak C, ale predpokladam, ze to bude stejny), je presne definovano jak se to bude chovat. Je to normalni vyskoceni ze vsech zanorenych scope. Zadne vyskakovani z okna, je to primy vychod ven. Promin, ale ty jsi dalsi takovy pripad, o kterem jsem mluvil....

Re:Použití příkazu GOTO v jazyku C
« Odpověď #10 kdy: 19. 08. 2019, 09:35:17 »
Pouziti GOTO mi pripada jako "ted vyskoc z okna" ono to nejak dopadne.

Očividně jste dobře naučený to oblíbené "zapomeňte na goto". Skok uvnitř funkce je totiž v C naprosto legální a nemá žádné nepředvídatelné následky.

Re:Použití příkazu GOTO v jazyku C
« Odpověď #11 kdy: 19. 08. 2019, 10:42:45 »
Obcas, krome uz zminenych pripadu se hodi na vyskakovani z vicenasobne vnorenych smycek. Nekdy dost hodne. Na tom je obcas pekne poznat nezkuseneho programatora, ktery vyrobi strasne slozity a nepochopitelny bazmek, kde na prvni pohled vubec neni poznat co byl zamer, protoze ve skole se dozvedel, ze goto je zlo a ted ma strach ho pouzit. :)
Pouziti GOTO mi pripada jako "ted vyskoc z okna" ono to nejak dopadne. Misto: nech toho co delas, vyjdi dverma, zamkni a sejdi ze schodu dolu.

To je poradny nesmysl,  C++ (nevim jak C, ale predpokladam, ze to bude stejny), je presne definovano jak se to bude chovat. Je to normalni vyskoceni ze vsech zanorenych scope. Zadne vyskakovani z okna, je to primy vychod ven. Promin, ale ty jsi dalsi takovy pripad, o kterem jsem mluvil....

Presne tak, akorat ze tusim u C narozdil od C++ ti to dovoli preskocit inicializace promennych, coz neni zrovna super ale pokud ma clovek zapnute warningy tak si toho vsimne u u toho C

Re:Použití příkazu GOTO v jazyku C
« Odpověď #12 kdy: 19. 08. 2019, 10:45:12 »
Kdyz tedy pouziji goto uvnitr nejakeho bloku kodu a vyskocim z tohoto bloku, povazuje prekladac zmineny blok kodu (ze ktereho jsem vyskocil) za ukonceny? Nebo ho nechava nejak otevreny? Viz tento priklad:

Kód: [Vybrat]
int i, j;

for(i = 0; i < 10; ++i) {
for(j = 0; j < 20; ++j) {
if(j == 5)
goto vylez_z_cyklu;
}
}

vylez_z_cyklu: printf("j je rovno %d\n", j);

Re:Použití příkazu GOTO v jazyku C
« Odpověď #13 kdy: 19. 08. 2019, 12:24:27 »
Kdyz tedy pouziji goto uvnitr nejakeho bloku kodu a vyskocim z tohoto bloku, povazuje prekladac zmineny blok kodu (ze ktereho jsem vyskocil) za ukonceny? Nebo ho nechava nejak otevreny? Viz tento priklad:

Kód: [Vybrat]
int i, j;

for(i = 0; i < 10; ++i) {
for(j = 0; j < 20; ++j) {
if(j == 5)
goto vylez_z_cyklu;
}
}

vylez_z_cyklu: printf("j je rovno %d\n", j);

Samozrejme ze za ukonceny, proste si v tom miste odesel. Je to jako by si tam dal break; a za tim vnitrnim forem byl zase break;

ByCzech

  • *****
  • 1 848
    • Zobrazit profil
    • E-mail
Re:Použití příkazu GOTO v jazyku C
« Odpověď #14 kdy: 19. 08. 2019, 12:39:00 »
Kdyz tedy pouziji goto uvnitr nejakeho bloku kodu a vyskocim z tohoto bloku, povazuje prekladac zmineny blok kodu (ze ktereho jsem vyskocil) za ukonceny? Nebo ho nechava nejak otevreny? Viz tento priklad:

Kód: [Vybrat]
int i, j;

for(i = 0; i < 10; ++i) {
for(j = 0; j < 20; ++j) {
if(j == 5)
goto vylez_z_cyklu;
}
}

vylez_z_cyklu: printf("j je rovno %d\n", j);

Co vám brání si to zkompilovat a pak to disasseblovat, aby jste viděl, jak to dopadlo?