Dlaczego goto to zło?
Ostatnio zmodyfikowano 2011-05-01 20:27
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 |
|
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
bool koniec = false; for(...) { for(...) { for(...) { koniec = true; break; } if( koniec ) break; } if( koniec ) break; }
jest czytelniejsze od
for(...) for(...) for(...) { goto koniec; } koniec:
.
Oczywiście używanie goto zamiast pętli to wariactwo. |
|
McAffey |
» 2011-05-01 04:04:12 Proponuję zmienić tytuł tematu na bardziej adekwatny do treści i łatwiejszy w odszukaniu. |
|
Bartekko Temat założony przez niniejszego użytkownika |
» 2011-05-01 11:11:47 zrobione |
|
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ą. |
|
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. |
|
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 |
|
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
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; znaleziono: }
|
|
|
1 « 2 » 3 |