Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оператор GOTO, за или против 
:(
    Опции темы
 
Оператор GOTO
Нет, это бред, который мешает мыслить!!! [ 11 ]  [55.00%]
Да, это неотъемлемая чать программирования!!! [ 9 ]  [45.00%]
Всего проголосовавших: 20
В этом опросе возможен один вариант ответа
Гости не могут голосовать 
foRaver
  Дата 12.1.2004, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: нет
Всего: 3



Я тут вступил как-то в жуткий спор по этой теме и услышал в ответ какой-то бред!
Очень хочеться услышать ваше мнение по этой теме тоже.
PM MAIL WWW ICQ YIM   Вверх
mr.DUDA
Дата 12.1.2004, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: нет
Всего: 232



Это, по ходу, к какому языку программирования относится ?
Если к C/C++, то я согласен, что goto - сакс.


--------------------
user posted image
PM MAIL WWW   Вверх
foRaver
Дата 12.1.2004, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: нет
Всего: 3



Ко всем абсолютно. smile.gif
Mozhet в некоторые он кое-как вписывается, а после написания 1000 строк кода, уже через неделю изза этого goto невозможно будет нормально разобраться, что и как...
PM MAIL WWW ICQ YIM   Вверх
Sardar
Дата 12.1.2004, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Все же красивые обороты получаются с goto. Бывает код компактней выходит. А в целом это рассматривается так: мне нравится иногда использовать goto когда это не нарушает логику программы, но мне не нравится читать запутанный код других smile.gif.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Chingachguk
Дата 13.1.2004, 09:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Лучше goto может быть только условный goto ;)

Эта тема активно обсуждалась в свое время в разделе "c++".


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Secandr
Дата 13.1.2004, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 2
Всего: 39



Последний раз использовал этот оператор в паскале на олимпиаде для отладки, забыл его убрать и в итоге проиграл sad.gif
В Perl и PHP не пользовался и даже не знаю есть ли они.


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
Chingachguk
Дата 13.1.2004, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

Последний раз использовал этот оператор в паскале на олимпиаде для отладки, забыл его убрать и в итоге проиграл


Это мне напомнило случай, произошедший со мной в 1-м классе ;)

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


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
December
Дата 14.1.2004, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: нет
Всего: 57



В асме без jmp не обойтись, а в остальных языках (кроме, говорят, фортрана) - НЕФИГ! Надо искать обходные пути!


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
shedon
Дата 14.1.2004, 09:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: нет
Всего: 11



На счёт goto в Си++, я слышал такое высказывание:
Цитата

Число операторов goto, в программе, обратно пропарционально, уровню программиста, т.е. чем больше операторов goto в программе, тем глупее программист.

За дословность цитаты не ручаюсь!!!

Цитата
В асме без jmp не обойтись

Согласен.

Мне даже рассказывали случай, когда у чела не приняли прогу(на Си++), пока он от туда не выкенет все goto.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
p0s0l
Дата 14.1.2004, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: нет
Всего: 112



Вот уже не вспомню когда я в последний раз использовал goto, зато помню, что когда начинал прогать на Паскале без goto жить не мог... Сейчас goto мне кажется лишним оператором...



--------------------
С уважением, г-н Посол.
PM   Вверх
Ars
Дата 14.1.2004, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 28.8.2003
Где: Московская обл.

Репутация: нет
Всего: 2



Даже и не знаю, как им пользоваться в С smile.gif


--------------------
Есть многое на свете, друг Горацио,
С чем очень долго можно прое..!
PM MAIL   Вверх
shedon
Дата 14.1.2004, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: нет
Всего: 11



Цитата
Даже и не знаю, как им пользоваться в С 

Точно также как и везде.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
December
Дата 14.1.2004, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: нет
Всего: 57



Цитата
Даже и не знаю, как им пользоваться в С
Смущённо прячась под стол и убирая все ссылки на автора...smile.gif


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 15.1.2004, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: нет
Всего: 232



У оператора goto в С++ есть один "маленький" недостаток - нельзя делать переход "мимо" инициализации переменной, и какие-то чудные вещи получаются при выходе в/за блоки for/while.


--------------------
user posted image
PM MAIL WWW   Вверх
shedon
Дата 15.1.2004, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: нет
Всего: 11



Цитата
У оператора goto в С++ есть один "маленький" недостаток - нельзя делать переход "мимо" инициализации переменной, и какие-то чудные вещи получаются при выходе в/за блоки for/while.

Ни когда не использовал оператор goto в с++, по этому таких проблемм не знаю.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 16.1.2004, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Ага. Тогда вот что я скажу. Пусть есть такая реализация:

Цитата

int IsEnough= 0;

for(int Pivo=20; ( !IsEnough ) && (Pivo>0); Pivo--)
{
  DrinkOnePivo(true);
  for(int Vodka=20; Vodka>0; Vodka--)
  {
      DrinkOneVodka(true);
      if ( !CanIAnswerMyNameGood() )
      {
         IsEnough= 1;
         break;
      }
  }
}


Но гораздо элегантнее написать так:

Цитата

for(int Pivo=20; Pivo>0; Pivo--)
{
  DrinkOnePivo(true);
  for(int Vodka=20; Vodka>0; Vodka--)
  {
      DrinkOneVodka(true);
      if ( !CanIAnswerMyNameGood() )
         goto IsEnough;
  }
}
IsEnough:


Это сообщение отредактировал(а) Chingachguk - 16.1.2004, 10:14


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Secandr
Дата 16.1.2004, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Связист
****


Профиль
Группа: Экс. модератор
Сообщений: 4043
Регистрация: 3.8.2003
Где: Russia, Volgograd

Репутация: 2
Всего: 39



Chingachguk А если таких goto стоит куча и они посылают не только за пределы цикла,... Как такое читать?


--------------------
Мышки плакали, кололись, но продолжали жрать кактусы (с) cisco
PM ICQ AOL   Вверх
shedon
Дата 16.1.2004, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: нет
Всего: 11



Цитата

Ага. Тогда вот что я скажу. Пусть есть такая реализация:

QUOTE 

int IsEnough= 0;

for(int Pivo=20; ( !IsEnough ) && (Pivo>0); Pivo--)
{
  DrinkOnePivo(true);
  for(int Vodka=20; Vodka>0; Vodka--)
  {
      DrinkOneVodka(true);
      if ( !CanIAnswerMyNameGood() )
      {
        IsEnough= 1;
        break;
      }
  }
}



Но гораздо элегантнее написать так:

QUOTE 

for(int Pivo=20; Pivo>0; Pivo--)
{
  DrinkOnePivo(true);
  for(int Vodka=20; Vodka>0; Vodka--)
  {
      DrinkOneVodka(true);
      if ( !CanIAnswerMyNameGood() )
        goto IsEnough;
  }
}
IsEnough:


Я всегда делаю по первому примеру.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
Deface
Дата 16.1.2004, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


def
****


Профиль
Группа: Экс. модератор
Сообщений: 2041
Регистрация: 22.11.2002
Где: г. Дубна, МО

Репутация: нет
Всего: 21



Не, если ГОТО много, то в программе разобраться нереально!


--------------------
Когда я умер, не было никого, кто бы это опроверг 
(с)
PM MAIL ICQ   Вверх
mr.DUDA
  Дата 16.1.2004, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: нет
Всего: 232



Chingachguk, плагиатор !!! tounge.gif tounge.gif tounge.gif biggrin.gif biggrin.gif tounge.gif tounge.gif tounge.gif biggrin.gif biggrin.gif biggrin.gif
Цитата
for(int Pivo=20; ( !IsEnough ) && (Pivo>0); Pivo--)
{
  DrinkOnePivo(true);



--------------------
user posted image
PM MAIL WWW   Вверх
oleg1973
Дата 16.1.2004, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



да ладно нормальный оператор


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 17.1.2004, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

Chingachguk А если таких goto стоит куча и они посылают не только за пределы цикла,... Как такое читать?


и

Цитата

Не, если ГОТО много, то в программе разобраться нереально!


Ну так способов испортить код существует много ... Например, часто нажимая на insert+past... Фишка в том, что надо делать как лучше а не так, как учат профессора ;)


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
December
Дата 17.1.2004, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Antitheorist
****


Профиль
Группа: Участник
Сообщений: 4423
Регистрация: 14.8.2002
Где: Харьков

Репутация: нет
Всего: 57



Всё равно наличие Goto говорит о непродумманости алгоритма. Пусть я напишу больше букв в коде, но через месяц я пойму, что имел в виду, просматривая этот кусок. С гоуту буду разбираться на порядок дольше.


--------------------
Для друзей с винграда - скидки на разработку сайтов
PM MAIL WWW ICQ   Вверх
DENNN
Дата 17.1.2004, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



December, согласен. В школе долго не понимал чем плохо использование goto. В какой-то книге по GWBASIC прочитал: "уровень профессионализма программиста уменьшается с каждым использованием в програме оператора goto", и там же теорему о том, что "любой алгоритм, в котором применяется оператор безусловного перехода можно переписать не используя данный оператор". Стало обидно, попробовал - интересно, но вроде ничего особенного. Потом еще несколько раз "заставил" себя не пользоваться GOTO и понял что это действительно так - без goto алгоритм выходит намного лучше, а последующие модификации проги выполняются почти безболезненно. Все равно как ООП и линейное программирование - в больших проектах для внесения изменений приходиться "разрушать и перепланировать" часть кода.

P.S. Бейсиком к тому моменту уже давно не пользовалься.
PM ICQ   Вверх
Dov
Дата 17.1.2004, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: нет
Всего: 88



Имхо, это извращение. Запивать бутылку пива ящиком водки. biggrin.gif biggrin.gif biggrin.gif
Я бы сделал так:
Код
for(int Vodka = 20; CanIAnswerMyNameGood() && Vodka > 0; Vodka--)
{
   DrinkOneVodka(true);
   for(int Pivo = 20; CanIAnswerMyNameGood() && Pivo > 0; Pivo--)  
       DrinkOnePivo(true);  
}
и не заморачивался бы ни с break'ом, ни с goto.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Chingachguk
Дата 17.1.2004, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



По поводу непродуманности и сопровождаемости.

Никто не грит, что нужно писать первое, что приходит в голову. Если посвятил достаточное количество усилий по разработке наилучшего варианта и в нем есть goto - оставть его. Если можешь написать
лучше без него - кто же спорит.

Сопровождение. Вроде как все согласны, что маленькие проекты ведешь один и тебе так удобнее и т.п., то можно. Если большие - то нельзя.

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

2. Опять-таки к вопросу о качестве кода. Удачное проектирование подразумевает, что каждый пишет свой модуль и потом все сопрягают свои усилия. Если модуль правило N человек, где N>10, то, скорее всего, в фирме какая-то фигня с текучкой кадров.

3. Понятие "читабельный код". Нет никаких четких правил по его написанию. Мне, к примеру, неудобно читать вложенные циклы, условия в них, опять циклы в условях и т.д. с многочисленными отступами. В результате тело самого внутреннего цикла начинается где-то с 50-ой позиции или еще далее. Отлично ! Никому не интересные проверки лежат рядом, а вот то, что интересно для анализа, нифига не видно. Но формально все правильно написано.

4. Из пункта 3 следует и 4: есть неудобство чтения goto, а вот мне намного неудобнее читать неоптимальный код. Если программер писал "лишь бы работало", то просматривать кучи чужих кодов вообще мрак. Обычно я такое удаляю и делаю заново. Но это гемор. Гораздо больший, нежели раз матернуться на чужой goto и ... все понять с первого раза.

5. Из пункта 4 следует и 5: реальность. Мы про что говорим ? Про реальные проекты или про "идеальные" ? Если про реальные, то везде, где я работал, я в той или иной мере видел все "достоинства", которые я перечислил в п.п. 3 и 4. Это неизбежный недостаток коммерческого программирования, когда надо "быстрее, а там видно будет". В той или иной степени такие вещи писали разные программеры и среди них были и неплохие. Но... никогда в реальной коммерции не будет отлажен код на таком уровне, что самым большим недостатком будет наличие goto в коде.

Ну а идеальные проекты пишутся на ... ассемблере ;) Потому, что иделаьные проекты не требуют переносимости - в идеальном проекте и машины одинаковые и архитектура - лучшие и не нужен си. Потому, что самый быстрый код и самый короткий код можно написать только на нем. Пример идеального проекта вы видели... в фильме "Терминатор" (1 часть). Код терминатора был написан на ассемблере ;) Ну а в ассемблере как бы нормально писать goto, просто там он именно в том виде, которым должен быть, а не в том, что реализован в языках HLL - условном.

Респект, Dov ! Ты единственный, кто попробовал улучшить мой пример без goto.

Цитата
Имхо, это извращение. Запивать бутылку пива ящиком водки.


Вообще-то обычно бывает именно так ;) Сначала "только по одной пива". Потом водки. Ну а потом нужно "залакировать" smile.gif Вот тут-то и выполняется условие прерывания.


Цитата

Я бы сделал так:CODE 
for(int Vodka = 20; CanIAnswerMyNameGood() && Vodka > 0; Vodka--)
{
   DrinkOneVodka(true);
   for(int Pivo = 20; CanIAnswerMyNameGood() && Pivo > 0; Pivo--) 
       DrinkOnePivo(true); 
}

и не заморачивался бы ни с break'ом, ни с goto.


Неплохо, неплохо. Не буду придираться. Но это пока не лучше моего варианта - по крайней мере, по скорости работы кода ;)

Это сообщение отредактировал(а) Chingachguk - 17.1.2004, 21:06


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
shedon
Дата 17.1.2004, 23:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1209
Регистрация: 17.1.2003
Где: Нижнiй Новгородъ

Репутация: нет
Всего: 11



Я сейчас посмотрел, оказывается библиотека MFC во всю пользуется операторам goto.
Цитата

"уровень профессионализма программиста уменьшается с каждым использованием в програме оператора goto",

Похоже её писали ламеры.


--------------------
Programming is like sex: One mistake and you have to support it your lifetime
PM MAIL WWW ICQ   Вверх
mr.DUDA
Дата 18.1.2004, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: нет
Всего: 232



Цитата
Я сейчас посмотрел, оказывается библиотека MFC во всю пользуется операторам goto.
Похоже её писали ламеры.

У них там в основном везде одна метка (в конце функции), на которую идёт переход из разных точек функции -- типа такой глобальный Cleanup в конце функции, без которого не обойтись, и который если не выполнить (скажем, сделать "return FALSE" вместо "goto Cleanup") - выйдет некорректное действие. Например, когда выполняется очень сложная инициализация очень сложной структуры, с кучей сложных проверок и циклов - то любая ошибка при инициализации оставит кусок (ресурсы WinAPI, открытый файл, выделенную память и пр.), который нужно корректно вернуть системе. Имхо, всё это можно было бы реализовать и без goto, грамотно разделив каждый такой сложный процесс на подуровни (скажем, в виде отдельных функций).

Но. Нигде в MFC и речи нету о повсеместных "прыжках взад-вперёд-налево"!
То есть, M$ взращивает идею "мы против goto, но если без goto никак уже не обойтись (или сроки жмут) - тогда Ok, давайте вставим один-два оператора, но не более того".


--------------------
user posted image
PM MAIL WWW   Вверх
oleg1973
Дата 18.1.2004, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: нет
Всего: 34



а ктонить сравнивал генерируемый код с гото и без а? поверьте господа есть разница


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
Dov
Дата 19.1.2004, 02:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: нет
Всего: 88



Цитата(Chingachguk @ 17.1.2004, 21:03)
Неплохо, неплохо. Не буду придираться. Но это пока не лучше моего варианта - по крайней мере, по скорости работы кода ;)

Chingachguk, ты не поверишь, но я предполагал, что рано или поздно встанет вопрос о скорости работы кода, хотя я, написав свой вариант, хотел показать, только, небольшую разницу в читабельности кода, так сказать, внешнее восприятие и не более того.
Просто, я (уж не знаю, почему) не люблю не только goto, но и break'и с continue'ями и, по мере возможности, стараюсь их обходить, не очень-то задумываясь об этой самой скорости.
Но, раз уж пошла такая тема, мне хотелось бы кое-что уточнить для себя.
Давай возьмём твой код и мой код и посмотрим, что же у нас, на самом деле, происходит.
Предположим, что CanIAnswerMyNameGood() изначально, т.е. до входа в первый цикл for равна FALSE.
Вот твой код:
Код
for(int Pivo = 20; Pivo > 0; Pivo--)
{
   DrinkOnePivo(true);
   for(int Vodka = 20; Vodka > 0; Vodka--)
   {
       DrinkOneVodka(true);
       if ( !CanIAnswerMyNameGood() )
           goto IsEnough;
   }
}
IsEnough:

Что же произойдёт дальше? Давай посмотрим(пока мы при памяти).
1. Проверяем, есть ли ещё у нас пиво - Pivo > 0. // ЕСТЬ
2. Пьём бутылочку - DrinkOnePivo(true). // хотя не должны этого делать, так как уже - FALSE
3. Проверяем, есть ли ещё у нас водка - Vodka > 0. // ЕСТЬ
4. Пьём бутылочку - DrinkOneVodka(true). // хотя не должны этого делать, так как уже - FALSE
5. Проверяем, а не FALSE ли у нас - if ( !CanIAnswerMyNameGood() ). // FALSE
6. И, только сейчас, выходим из цикла - goto IsEnough.

Вот мой код:
Код
for(int Vodka = 20; CanIAnswerMyNameGood() && Vodka > 0; Vodka--)
{
  DrinkOneVodka(true);
  for(int Pivo = 20; CanIAnswerMyNameGood() && Pivo > 0; Pivo--)  
      DrinkOnePivo(true);  
}

Посмотрим, что же здесь.
1. Проверяем - CanIAnswerMyNameGood() == TRUE ??? // нет, водку уже не проверяем, в цикл даже не заходим
Вопрос: почему ты считаешь, что твой код быстрее? Даже при условии, что он будет работать корректно.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Chingachguk
Дата 19.1.2004, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



По поводу корректности.

Изначально я имел в виду именно то, что проверку можно (или имеет смысл) выполнять после выполнения каких-то действий внутри второго цикла. Скажем, я бы мог уточнить свой пример таким образом:

Цитата

for(int Pivo = 20; Pivo > 0; Pivo--)
{
  DrinkOnePivo(true);
  for(int Vodka = 20; Vodka > 0; Vodka--)
  {
      DrinkOneVodka(true);
      if ( !CanIAnswerMyNameGood(Pivo,Vodka) )
          goto IsEnough;
  }
}
IsEnough:


В самом деле, какой смысл проверять, можешь ли ы шевелить языком, если не выпил хотя бы буылочку пивка ? ;)

По поводу бысродействия.

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

Цитата

if ( !CanIAnswerMyNameGood() )
          goto IsEnough;
for(int Pivo = 20; Pivo > 0; Pivo--)
{
  DrinkOnePivo(true);
  for(int Vodka = 20; Vodka > 0; Vodka--)
  {
      DrinkOneVodka(true);
      if ( !CanIAnswerMyNameGood() )
          goto IsEnough;
  }
}
IsEnough:


Возможно, ты можешь сказать, что время проверки во внешнем цикле несущественно (всего 1:20 проверок). Однако я могу привести и такой пример:

Цитата

for(int Pivo = 200; !CanIAnswerMyNameGood() && Pivo > 0; Pivo--)
{
  DrinkOnePivo(true);
  for(int Vodka = 2; Vodka > 0; Vodka--)
  {
      DrinkOneVodka(true);
      if ( !CanIAnswerMyNameGood() )
          goto IsEnough;
  }
}
IsEnough:


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



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
M@xim
Дата 26.1.2004, 11:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Мой аккадемик препод настоятельно рекомендовал не пользоваться этой ошибкой природы.
Побочный эффект may be , а если длина кода уж действительно 1..... строк то закольцованность.
А для консольных прог это реалити.
Это факт.
  Вверх
GRON
Дата 3.2.2004, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 84
Регистрация: 21.11.2003

Репутация: нет
Всего: нет



Считаю, что программер, часто использующий goto делает это от того, что не в состоянии подумать немного и родить нормальночитаемый и безглючный код без него. У меня раньше тоже был огромный соблазн сделать это, тогда я не всавлял goto потому что хотел потренировать мозги и обойтись без легкого способа (бесплатный сыр сами знаете где бывает), теперь понимаю, что это еще и вредно.
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Продвижение и оптимизация сайтов | Следующая тема »


 




[ Время генерации скрипта: 0.1441 ]   [ Использовано запросов: 24 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.