Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.27;
Скачать: CL | DM;

Вниз

Goto   Найти похожие ветки 

 
Song ©   (2002-04-15 11:16) [0]

Как многоуважаемый ALL относится к данному оператору? Нас учили, что пользоваться Goto плохо, это мол типа слабость программиста. Однако иногда он очень удобен для повышения читабельности кода и уменьшения ветвлений.
У кого какое мнение?


 
SB.John ©   (2002-04-15 11:24) [1]

Я им не пользуюсь, но не потому что это некорректный стиль программирования - иногда goto действительно удобнее. Просто в Паскале для него нужно метки объявлять заранее, а это лениво как-то. К тому же вместо goto очень удобно пользоваться всякими
continue, exit,halt,abort .


 
Виктор Щербаков ©   (2002-04-15 11:27) [2]


> Однако иногда он очень удобен для повышения читабельности
> кода и уменьшения ветвлений.

Гм. А пример можно? Просто пока сложно представить такую ситуацию.

Страуструп оправдывал применение goto для выхода из вложенных циклов. Действительно очень эффективно, но это на C++.

А вообще у меня алергия на goto появилось после перевода достаточно большой проги с Фортрана. Видели когда нибудь вычисляемый goto в Фортране или Бэйсике? Оооо... Лучше таких ужасов не видеть!



 
VictorT ©   (2002-04-15 11:31) [3]

>Страуструп оправдывал применение goto для выхода из вложенных циклов. Действительно очень эффективно, но это на C++.
Кстати тут удобно применять, например, исключения.


 
Виктор Щербаков ©   (2002-04-15 11:34) [4]

VictorT © (15.04.02 11:31)
Согласен. Просто это неочевидное их применение.

PS: Это еще раз доказывает избыточность конструкции goto.


 
Anatoly Podgoretsky ©   (2002-04-15 11:41) [5]

Вирт признавался, что у него рука не поднялась на исключение GOTO из языка.


 
VictorT ©   (2002-04-15 11:59) [6]

А как насчёт Ассемблера? Обойдёмся без переходов?


 
Song ©   (2002-04-15 13:11) [7]

Сейчас прямо наверно пример не привести, но иногда лечге засадить переход, чтобы "не колдовать" :)
Я не говорю, чтобы его писать через строчку, а так иногда.
А кто скажет, с точки зрения получаемого в результате машинного кода - применение goto как сказывается на скорости и простоте кода, его эффективности?


 
Anatoly Podgoretsky ©   (2002-04-15 13:17) [8]

VictorT © (15.04.02 11:59)
А ассебмлеры используются алиасы для машинных команд


 
VictorT ©   (2002-04-15 13:23) [9]

>А ассебмлеры используются алиасы для машинных команд
алиасы - в смысле мнемонические обозначение? Если да, то я в курсе. Я к тому, что там все ветвления, циклы и т.д. реализуются через переходы. Кстати я програмирование начинал с Бейсика, и когда переходил на Асм, то это мне помогло (в смысле Бейсик).


 
Anatoly Podgoretsky ©   (2002-04-15 13:39) [10]

Да я специально применил такой термин, что бы подчеркнуть


 
Андрей Сенченко ©   (2002-04-15 19:49) [11]

А что Вы так на него набросились ?
Между прочим полезнейшая вещь в плане психологической обработки :)
1. Выполняет роль спасательного круга, надежно прибитого к стенке гальюна. В том плане, что ежели уж совсем кранты - отдерешь как миленький и воспользуешься по полной программе. Главное в этом деле - знать что он есть и испытывать по этому поводу комфортные ощущения в области подкорки.
2. Надежность той самой прибивки к стенке гарантируется всеобщим презрением к коду с GOTO и мнением, что "это не есть хорошо". В самый последний момент, когда казалось бы все тонет, все из всех пробоин течет и пора за ним бежать - вспоминаешь, что "это не есть хорошо" и идешь латать те самые пробоины собственными руками.

Стимулирует однако.


 
copyr25 ©   (2002-04-15 22:15) [12]

Go to незаменим, если Вы программируете .dpr.
Без VCL, в частности, без таймера.



 
copyr25 ©   (2002-04-15 22:20) [13]

>Вирт признавался, что у него рука не поднялась на исключение GOTO из языка.
И правильно. Создатель Паскаля, иначе бы, растерял 50% почитателей. Метка и посылка
на нее - почти единственный выход из запутанной ситуации:)))


 
ION T ©   (2002-04-15 22:26) [14]

А я со времен появления объектного паскаля про гото и не вспоминал:) Я даже уверен что label и goto - единственные киворды которые я никогда не использовал в оПасе (ну разве, что ещё архаический inline)


 
arbiter ©   (2002-04-17 02:08) [15]

Между прочим тот самый Вирт удалил GoTo из двух своих последующих языков.
Даже у меня где то валяется строгое доказательство избыточности этого оператора, поищу если найду кину.


 
Voldemar ©   (2002-04-17 04:27) [16]

В какой-то книжке по программированию было написано, что процедура, в которой больше одного Goto похожа на блюдо с макаронами...
А вообще - иногда приходится пользоваться, к счастью - редко.


 
MBo ©   (2002-04-17 06:22) [17]

У меня GOTO встречается только в переведенных с Фортрана алгоритмах, и то в местах с нетривиальной логикой.


 
Praco ©   (2002-04-17 09:11) [18]

А я на Паскале ни разу в жизни не применил GOTO. Впрочем, видел очень уважаемых программеров, применявших и весьма часто.


 
evgeg ©   (2002-04-17 10:01) [19]

Страуструп оправдывал применение goto для выхода из вложенных циклов.

Так можно делать в С, но не в современном С++.. Если в блоке цикла объявлен объект, его деструктор не вызовется при выходе с помощью goto.


 
Alx2 ©   (2002-04-17 10:11) [20]

Интересно, есть ли у кого кусок кода с Goto, который при изъятии оного теряет свою ясность и лаконичность?


 
Виктор Щербаков ©   (2002-04-17 10:11) [21]

evgeg © (17.04.02 10:01)


> Если в блоке цикла объявлен объект, его деструктор не вызовется
> при выходе с помощью goto.


Еще один аргумент против goto. Да и орпавдание это я видел лишь в первом издании книги Страуструпа. В языке еще не было обработки исключений, и по другому эффективно выйти из цикла - ну никак...


 
VictorT ©   (2002-04-17 10:21) [22]

Приведу пару цитат из книги В.Ф. Очкова, Ю.В Пухначёва "128 советов начинающему программисту":

При написании программ используй семь и не более управляющих конструкций, изменяющих естественный ход выполнения операторов:
1) цикл "пока";
2) альтернативу;
3) множественное ветвление;
4) цикл "до";
5) цикл с параметром;
6) вызов процедуры (подпрограммы);
7) переход к метке. ......

Если программирование можно уподобить игре на семиструнной гитаре, то вот те струны, рождающие мелодию


 
evgeg ©   (2002-04-17 10:23) [23]

> Alx2

Да тот же пример с goto в несеольких влож. циклах. Сравните (классический Паскаль без исключений):


for i := 1 to n1 do
for j := 1 to n2 do
for k := 1 to n3 do
for h := 1 to n4 do
begin
...
if (...) then
goto lab1;
end;
lab1:

i := 1;
fl := true;
while fl and (i <= n1) do
begin
j := 1;
while fl and (j <= n2) do
begin
k := 1;
while fl and (k <= n3) do
begin
h := 1;
while fl and (h <= n4) do
begin
....
fl := not (...);
inc (h);
end;
inc (k);
end;
inc (j);
end;
inc (i);
end;


 
Alx2 ©   (2002-04-17 10:54) [24]

Да уж. Лаконичность отдыхает :(

I := 1;
J := 1;
K := 1;
H := 1;
While (I <= n1) and (not condition(i,j,h,k)) Do
Begin
inc(H);
If H > n4 Then
Begin
H := 1;
inc(K);
If K > n3 Then
Begin
K := 1;
inc(J);
If J > n2 Then
Begin
J := 1;
inc(I);
End;
End;
End;
End;


 
Desdechado ©   (2002-04-17 11:15) [25]

Как говорил один мой преподаватель программирования лет 10 назад:
"Вообще-то нельзя, но если очень хочется, то можно".
Правда, это было сказано по другому поводу, но может быть расширено и обобщено на предмет обсуждения (и многие другие жизненные ситуации :))
Сам я уже давно не использую GOTO, просто нет надобности. Но никакого предубеждения нет. Все крайности вредны, в т.ч. с безапелляционным откидыванием языковых конструкций.


 
Alx2 ©   (2002-04-17 11:26) [26]

Согласен. Но иногда бывает интересно поизвращаться


 
evgeg ©   (2002-04-17 11:37) [27]

Ваш пример немного выигрывает у примера с while по кол-ву вычислений лог. выр-й, он длиннее на одну строку (если учесть ..., которое в примере с while означает вып-е каких-то полезных действий), а по понятности он значительно проигрывает примеру с while.

Оба они проигрывают и по эффективности, и по длине, и по понятности примеру с goto.


 
vuk ©   (2002-04-17 11:58) [28]

to evgeg:
>Да тот же пример с goto в несеольких влож. циклах. Сравните
>(классический Паскаль без исключений):

А теперь то же самое, но без goto


procedure DoSomething;
var
i, j, k, h : integer;
begin
for i := 1 to n1 do
for j := 1 to n2 do
for k := 1 to n3 do
for h := 1 to n4 do
begin
...
if (...) then
exit;
end;
end;


Если нужно, то такая пороцедура делается вложенной. Точно так же во вложенную процедуру может быть вынесен любой из вложенных циклов.


 
evgeg ©   (2002-04-17 12:23) [29]

> vuk
В Паскале да, а вот в С вложенных процедур нет.


 
evgeg ©   (2002-04-17 12:24) [30]

> vuk
Все таки с goto нагляднее и понятнее получается и в Паскале.


 
evgeg ©   (2002-04-17 12:26) [31]

Когда все циклы выносим вызов процедуры происходит один раз - ерунда, а вот когда вложенные - затраты на вызов процедуры могут скзаться на скорости.


 
Agent Smith ©   (2002-04-17 19:10) [32]

Я, кстати в одной своей проге довольно часто использовал goto. Когда писал свой (не стандартный)поиск.


 
anpsoft   (2002-04-18 02:52) [33]

я навпример вижу один случай когда без goto лучше не надо :)
это программы полученные при помощи генераторов кода, и как частный случай (но очень поучительный), результат работы программ типа yacc на pascal. Там их сотни могут быть.
Видать удобочитаемый текст скорее всего нельзя, да и не нужно.
Его только компилятор читать будет.




Страницы: 1 вся ветка

Текущий архив: 2002.05.27;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.012 c
7-88654
МИФИст
2002-03-02 21:19
2002.05.27
Определение типа протокола...


3-88357
Voldemar
2002-04-30 21:11
2002.05.27
Печать из QuickReport


3-88322
Vladimir V.N
2002-04-30 08:52
2002.05.27
InterBase and Internet Explorer


1-88508
Бывалый
2002-05-15 20:12
2002.05.27
Вопрос по формам.


1-88499
Олег Лаукарт
2002-05-11 14:44
2002.05.27
показ html текста ..