Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dlaczego nie używać etykiet w C++?

Ostatnio zmodyfikowano 2010-07-06 17:14
Autor Wiadomość
maciejo
Temat założony przez niniejszego użytkownika
Dlaczego nie używać etykiet w C++?
» 2010-07-06 15:05:02
Mam kilka pytan:
1.Dlaczego mowi sie zeby nie uzywac etykiet , a nawet jesli , to zeby zapomniec o goto?
2.Czym mozna zastapic goto , poniewaz gdybym chcial zrobic to za pomoca petli , zajeloby mi to kilka razy wiecej czasu (musialbym sie jeszcze podszkolic i prawdopodobne , ze pisac kod od nowa)
P-19581
SeaMonster131
» 2010-07-06 15:10:58
Ja Ci tak profesjonalnie nie odpowiem, ale ja też UŻYWAŁEM goto itd. i mówili mi żebym go nie używał bo wtedy kod jest nieczytelny itp, goto powinno sie tylko używać w ostateczności :)
Napisałem, że "używałem" bo dzisiaj napisałem program całkowicie bez goto i wyszedł mi lepiej niż z goto a użyłem tylko pętli do-while :)
I faktycznie kod jest czytelniejszy, i w ogóle nie trzeba kombinować, jak to robiłem wcześniej :D
Moja rada: Napisz sobie jakiś prosty przykład, ale taki w którym użyjesz goto, a potem goto zastąp np jakąś pętlą. Zobaczysz różnicę :)
pozdr
P-19582
maciejo
Temat założony przez niniejszego użytkownika
» 2010-07-06 15:13:16
jesli to zmienia TYLKO czytelnosc kodu to moze chociaz chwilowo przy tym pozostane
P-19584
SeaMonster131
» 2010-07-06 15:15:47
No nie wiem czy TYLKO zmienia czytelność kodu :D
Może nie tylko :D Ale lepiej żeby ktoś inny Ci to wytłumaczył, bo zrobi to lepiej:)
P-19585
maciejo
Temat założony przez niniejszego użytkownika
» 2010-07-06 15:18:01
No to w takim razie czekam na wyjasnienie od PR0
PS: Jak przeskoczyc do etykiety , ktora jest zadeklarowana pozniej od wywolania(inna funkcja)
tzn.
funkcja ()
{
goto etykieta;
}
main()
{
etykieta :
}
prosze pomozcie
P-19586
TheLukon
» 2010-07-06 15:35:47
Nie rozumie Cię zbytnio. Twierdzisz że musisz się podszkolić, a już korzystasz z funckji. To już coś potrafisz. Pętle z operatorami logicznymi albo bitowymi  powinny w całości zastąpić instrukce goto. ;)

I powinno się zmienić temat postu, ponieważ etykieta to nie jest instrukcja goto, to wszystkie nazwy po ktorej wystepuje dwukropek ;)
P-19587
ison
» 2010-07-06 15:37:32
nie da się (z tego co wiem) przeskakiwać do labla który znajduje się w innej funkcji. Sam nie wyobrażam sobie jakby to miało działać.

Korzystając z labli przestajesz rozumieć schematyczne działanie programu. Zwalnia cię to z myślenia i nie uczysz sie niczego. Zawsze istnieje rozwiązanie, które nie wymaga labli. Oprócz tego kod jest straszliwie nieczytelny i niemal że niezdatny do zdebugowania dla innej osoby. Szukanie jednego błędu może zająć kilka godzin w tym całym bałaganie. Jeśli już nie widzisz innej prostej drogi to możesz ewentualnie użyć labla w celach pisania jakiegoś programu dla siebie, lecz zdecydowanie odradzam.
Żadna osoba na świecie nie poleciłaby ci korzystania z labli na początku nauki C++, ja bym im zaufał i je sobie odpuścił ;)
P-19589
DejaVu
» 2010-07-06 16:00:09
Na temat etykiet powtarza się z definicji, że jest to zło i nie należy ich używać, ponieważ są konstrukcje w językach wysokiego poziomu, które są dużo prostsze w użyciu, krótsze i czytelniejsze. Programista powinien starać się tworzyć kod czytelny, a etykiety w rękach początkującego programisty to po prostu makabra.
C/C++
#include <cstdio>

int main()
{
    //INFO: Pętla za pomocą for
    for( int x = 0; x < 10; x++ )
         printf( "for %d\n", x );
   
    //INFO: Pętla za pomocą etykiet, która robi to samo co for
    {
        int x = 0;
        label:
        if( x < 10 )
        {
            printf( "label %d\n", x );
            x++;
            goto label;
        }
    }
   
    return 0;
}
Powyższy kod prezentuje zastosowanie w praktyce etykiety oraz pętli for. Konstrukcyjnie kod jest dużo krótszy gdy zastosujemy odpowiednie pętle zamiast etykiet. Ponadto zyskuje on znacznie na czytelności.

Etykiety poprawiają czytelność kodu tylko w jednym wypadku, tj. wyjście z kilku pętli naraz:
C/C++
for( int a = 0; a < 10; a++ )
{
    for( int b = 0; b < 10; b++ )
    for( int c = 0; c < 10; c++ )
    {
        if( jakis_specyficzny_warunek )
             goto do_glownej_petli;
       
    }
    do_glownej_petli:
}
W powyższym przypadku uzasadnionym jest zastosowanie etykiet, jednak w dzisiejszych czasach dąży się do tego aby algorytmy były złożoności co najwyżej kwadratowej, więc stosowanie powyższej techniki raczej będzie zaliczało się do rzadkości.

Reasumując: jeżeli nie znasz wszystkich rodzajów pętli języka w którym programujesz lub znasz je ale nie potrafisz zastępować kodu etykietowego pętlami to nie używaj etykiet, bowiem praktycznie zawsze zrobisz to źle. Kod ponadto będzie trudny w analizowaniu oraz w szukaniu ewentualnej przyczyny czemu działa źle.
P-19592
« 1 » 2
  Strona 1 z 2 Następna strona