Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.007 c
1-88420
Vint
2002-05-17 09:53
2002.05.27
Тип данных


3-88333
YouNick
2002-04-29 15:52
2002.05.27
удаленный сервер InterBase


4-88685
greenrul
2002-03-27 11:06
2002.05.27
Как понизить/повысить громкость системную?


1-88458
Fly`
2002-05-17 17:09
2002.05.27
Абсолютные координаты кнопки


7-88645
Mulder
2002-03-01 18:12
2002.05.27
Помогите начинающему...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский