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

Dlaczego goto to zło?

Ostatnio zmodyfikowano 2011-05-01 20:27
Autor Wiadomość
McAffey
» 2011-04-30 22:35:47
Myślę, że jeśli jest się początkującym to lepiej
goto()
 omijać, aby nabierać nawyki dbałości o kod, utrzymywania wszystkiego w porządku. Potem się dużo łatwiej programuje. Jednak jeśli już się ma wszystkie poprawne nawyki nabyte, a sytuacja jest na tyle skomplikowana, że
goto()
 to na prawdę dobre wyjście, to czemu by z niego nie skorzystać, po to ono przecież powstało (jednak mi się taka sytuacja jeszcze nigdy nie przydarzyła) ;P
P-32359
absflg
» 2011-05-01 02:54:07
W przypadku wielokrotnie zagnieżdżonych pętli każde inne rozwiązanie będzie mniej wydajne i (co jest tu przecież głównym argumentem) mniej czytelne. Bo możemy to zastąpić trzymaniem polecenia wyjścia w zmiennej bool. Każde sprawdzanie jej stanu po obiegu którejś z zewnętrznych pętli jest dodatkową operacją. A co do czytelności - chyba nikt nie powie, że
C/C++
bool koniec = false;
for(...) {
    for(...) {
        for(...) {
            //...
            koniec = true;
            break;
            //...
        }
        if( koniec ) break;
       
    }
    if( koniec ) break;
   
}
jest czytelniejsze od
C/C++
for(...)
for(...)
for(...) {
    //...
    goto koniec;
    //...
}
koniec:
.

Oczywiście używanie goto zamiast pętli to wariactwo.
P-32365
McAffey
» 2011-05-01 04:04:12
Proponuję zmienić tytuł tematu na bardziej adekwatny do treści i łatwiejszy w odszukaniu.
P-32366
Bartekko
Temat założony przez niniejszego użytkownika
» 2011-05-01 11:11:47
zrobione
P-32368
lynx
» 2011-05-01 11:55:17
Po prostu trzeba używać goto rozsądnie, nie przesadzać z nim. Czasem się zdarza w bardziej skomplikowanych projektach, że użycie goto nie jest takie złe jak wszyscy piszą.
P-32370
pekfos
» 2011-05-01 12:20:03
a wyszukiwarka to zło czy po prostu nie chce ci się szukać?
było o tym multum tematów. goto to zło bo zaciemnia kod i zaburza jego wykonywanie. goto wywodzi się z asma. kod C/C++ tłumaczony jest na asembler. w asmie nie ma ram bloków. i można tam skoczyć byle gdzie co chyba nadal jest możliwe w C/C++. tyle że tu skok w przestrzeń między blokami może wywołać nieprzewidziane konsekwencje.
to samo się tyczy skoku z funkcji do funkcji.
P-32371
Bartekko
Temat założony przez niniejszego użytkownika
» 2011-05-01 13:57:21
na pewno nie mam zamiaru skakać z funkcji do funkcji
P-32383
kamillo121
» 2011-05-01 14:10:25
Jak wspomniał pekfos było sporo wątków na ten temat a jeżeli tamto ci nie wystarcza to pozwolę sobie przytoczyć pewny fragment:


W C++ istnieje niechlubna instrukcja goto:
  goto identyfikator;
  identyfikator : instrukcja

Rzadko znajduje ona zastosowanie w ogólnym programowaniu wysokopoziomowym, lecz może być bardzo użyteczne, gdy program w C++ jest generowany przez inny program, a nie pisany bezpośrednio przez człowieka; np. instrukcje goto mogą być stosowane w parserze wygenerowanym z gramatyki przez generator parserów(wtrącenie ode mnie: jeżeli to ci nic nie mówi to to pomiń). Instrukcja goto może także być ważna w tych rzadkich przypadkach, kiedy osiągnięcie optymalnej efektywności staje się sprawą zasadniczą, np. w wewnętrznej pętli jakiegoś programu użytkowego czasu rzeczywistego.
 Jednym z kilku sensownych zastosowań goto w zwykłym kodzie jest umożliwianie wyjścia z zagnieżdżonej pętli lub instrukcji switch(break switch, która ją otacza). Na przykład

C/C++
void f()
{
    int i;
    int j;
   
    for( i = 0; i < n; i++ )
    for( j = 0; j < m; j++ )
         if( nm[ i ][ j ] == a ) goto znaleziono;
    //nie znaleziono  
   
    znaleziono:
    //nm[i][j]==a
}

P-32385
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona