Re[3]: А зайти?
От: Les Россия  
Дата: 23.04.03 15:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, folk, Вы писали:


F>Выйти из двух циклов сразу — это фигня. Вот зайти — для настоящих профессионалов.

F>Как вы это обычно делаете?
WH>Нууу.... Как бы тебе сказать.....

ИМХО, всю эту ветку давно пора в "Юмор"
Re[11]: Выйти из двух циклов сразу
От: WFrag США  
Дата: 23.04.03 15:05
Оценка: +1
Здравствуйте, Areex, Вы писали:

A>Здравствуйте, WFrag, Вы писали:


WF>>А еще через goto можно разложить if, do...while, и.т.д.


WF>>Так что это не аргумент. goto есть goto, а не break, continue,...


A>Читай внимательнее. break это goto, а не goto это break.

A>Причем тут твой пример я вообще не понял.

break — это goto,
while — это goto (чуть более завуалированный),
if — goto,
for — goto,
...
... << RSDN@Home 1.0 beta 6a >>
Re[9]: Выйти из двух циклов сразу
От: eaa Украина  
Дата: 23.04.03 16:26
Оценка:
Здравствуйте, Areex, Вы писали:

A>Здравствуйте, eaa, Вы писали:


eaa>>Здравствуйте, Areex, Вы писали:


A>>>Я не про то. Если ты пользуешся break&continue, ты используешь goto, путь и не явно.

eaa>>Как можно неявно использовать goto? Или есть goto в коде или нет, а то что оно возможно разложиться в один код, так это только твои догадки...

A>
A>while(1)
A>{
A>    if (a!=b) break;
A>    else goto out_of_cycle;
A>}
A>out_of_cycle:
A>


A>Нади отличие. Догадки блин...

Ну начнём с простого там написано goto там break

while(a)
{
a=false;
}
это тоже неявный goto?

то что break можно заменить goto не значит что это одно и тоже. Можно ведь все циклы заменить goto...
... << RSDN@Home 1.0 beta 6a >>
Re[10]: Выйти из двух циклов сразу
От: Areex  
Дата: 23.04.03 17:11
Оценка:
Здравствуйте, eaa, Вы писали:

eaa>Здравствуйте, Areex, Вы писали:



A>>Нади отличие. Догадки блин...

eaa>Ну начнём с простого там написано goto там break

Очевидно, что имелось ввиду логическое отличие.

eaa>while(a)

eaa>{
eaa> a=false;
eaa>}
eaa>это тоже неявный goto?

eaa>то что break можно заменить goto не значит что это одно и тоже. Можно ведь все циклы заменить goto...


Это эпидемия или теперь модно книжек не читать? goto это безусловный переход. while это безусловный переход? Детский сад блин.
В общем все это уже переосло в непотребный флейм, к тому же в этой ветку уже все много раз сказали, я завязываю, выходите из цикла по throw, если вам так больше нравится.
"Rakshasas? Quick, break out the poisoned bolts."
Re[4]: А зайти?
От: folk Россия  
Дата: 23.04.03 23:47
Оценка:
Здравствуйте, Les, Вы писали:

Les>Здравствуйте, WolfHound, Вы писали:


WH>Здравствуйте, folk, Вы писали:


F>Выйти из двух циклов сразу — это фигня. Вот зайти — для настоящих профессионалов.

F>Как вы это обычно делаете?
WH>Нууу.... Как бы тебе сказать.....

Les>ИМХО, всю эту ветку давно пора в "Юмор"


Вот и я про то же
На самом деле, люди не читают газеты, они принимают их каждое утро, так же как ванну. ©Маршалл Мак-Льюэн
Re[7]: Выйти из двух циклов сразу
От: Plague Россия 177230800
Дата: 24.04.03 07:36
Оценка:
Здравствуйте, Areex, Вы писали:

A>Я не про то. Если ты пользуешся break&continue, ты используешь goto, путь и не явно. Следовательно ни о каком исключении goto из программ и речи быть не может.

A>Использование же специальных конструкций для того, что бы избежать goto, есть ни что иное как победа догм над здравым смыслом. Я тут почитал всю ветку, над пёрлами типа throw рыдал просто. Нет, что бы придумать конструкцию, когда от goto избавляться не надо. Я в общем с паталогом согласен, на 100%.

IMHO? проблема не в том ка goto работает, а насколько читабельны программы с goto. Т.е. получается так называемы "spagetti code". Да, теоретически, повышается читабельность программы, где при выходе из вложенных циклов используется goto, в небольших циклах. Также бытует мнение, что целесообразно использование goto в функциях, повышает не только читабельность но и логичность, функция всегда завершается в определенном месте, а значит не надо искать окончание функции по всему коду:

f()
{
    // start code
    if(rand()%1)
    {
        // ...
        goto end;
        // ...
    }
    else
    {
        // ...
        goto end;
        // ...
    }
    end:
    // end code...
}


Но при всем при этом я не сторонник goto! считайте это религией... мои доводы:
Потенциальная сложность программы увеличивается при использовании в ней дополнительных ключевых слов. Плюс, логика программы становиться странноватой, т.к. приводит к использованию goto и break совместно, как бы параллельно.
Если весь текст цикла умещается на экране, зачем использовать goto, а если — нет, то я сомневаюсь что при использовании получится явное преимущество. Как тот, кто будет читать вашу программу поймет, не видя цикл целиком, куда ведет goto? По имени метки? Вед главный довод goto в читабельности, по сравнени с break, и то, что у goto нет никакой связи с операторами циклов, портит ему всю "малину".
Для большого числа вложенных циклов я вообще рекоммендую пересмотреть алгоритм. Применение goto очень часто приводит к более широкому его использованию, т.е. в следствие редактирования программы с этими операторами есть опасность, что получиться "spagetti code" в попытке внести минимум изменений.
В конечном итоге: есть комментарии которые неплохо было бы расставлять в таких местах, чтоб не забыть, что здесь происходит.

Так, что я продолжу не прибегать к использованию goto в своих программах. Ну, может быть, на сверх крайний случай.
... << RSDN@Home 1.0 beta 6 >>
Re[8]: Выйти из двух циклов сразу
От: Areex  
Дата: 24.04.03 08:44
Оценка: +1 -1
Здравствуйте, Plague, Вы писали:

P>IMHO? проблема не в том ка goto работает, а насколько читабельны программы с goto.


Вот все зарекаюсь больше эту ветку не читать и все равно читаю.
Вы поймите, не разницы между goto out; и break. И так и так последовательное исполнение программы нарушается. Ну какая тебе разница, что искать выход из цикла или метку? Метку даже проще.

P>Но при всем при этом я не сторонник goto! считайте это религией... мои доводы:


Во-во, один ляпнул "goto от диавола", и все бросились повторять. Я пять раз гоуту не использовал, а я шесть, благослови батюшка Николас.

P>Если весь текст цикла умещается на экране, зачем использовать goto, а если — нет, то я сомневаюсь что при использовании получится явное преимущество. Как тот, кто будет читать вашу программу поймет, не видя цикл целиком, куда ведет goto? По имени метки? Вед главный довод goto в


Так же как и не видя окончания цикла. Нажмет PgDn и посмотрит. Знаешь так далеко зайти можно, мало ли что ты в программе не видишь. Ты вот скорее всего не видишь опеределения класса. И что? Да ничего, откроешь и посмотришь. Не надо придумывать проблему там, где ее нет.

P>Для большого числа вложенных циклов я вообще рекоммендую пересмотреть алгоритм.


Согласен, об этом и речи нет. Вопрос в том, что делать если это не возможно.

P>Применение goto очень часто приводит к более широкому его


Ну что все залади повторять, приводит -- не приводит. Чем это он приводит? Я так же могу утверждать, что специальное избегание гоуту приводит к нечитаемому коду. Поскольку человек следуя догмам, лепит не задумываясь пургу всякую.

P>В конечном итоге: есть комментарии которые неплохо было бы расставлять в таких местах, чтоб не забыть, что здесь происходит.


А еще метку внятно назвать. Видишь как все просто. Если ты видишь метку goto end_of_this_cycle это снизит тебе читабельность?

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


Применять надо не на крайний случай, не где попало, а только там где уместно. Как собственно и любую вещь.
"Oh. He'll miss. Just look at my AC."
Re: Выйти из двух циклов сразу
От: little_alex  
Дата: 15.09.04 13:06
Оценка:
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


Если Perl
OUT:while(1)
{
   for(0..100)
   {
      if($_ eq 77) break OUT;
   }

}

Внимание OUT- это не метка а ИМЯ цикла
Не сказать что Perl способствует построению читабельных программ ,
но это то что мне не хватает в др. языках

LG>Как это сделать?
Re: Выйти из двух циклов сразу
От: black hermit Россия  
Дата: 15.09.04 13:16
Оценка:
Здравствуйте, LeonGorbachev, Вы писали:



LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?

Очень просто
bool flag = true;
while(flag)
{
  for(int i = 0; i < 100 && flag; i++)
  {
    if(i == 77)
      flag=false;
  }
}
The darkness around me
Shores of solar sea
Oh how i wish to go down with the sun....
Re: Выйти из двух циклов сразу
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 15.09.04 13:51
Оценка: +1
Здравствуйте, LeonGorbachev, Вы писали:

LG>
LG>while(1)
LG>{
LG>  for(int i = 0; i < 100; i++)
LG>  {
LG>    if(i == 77)
LG>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>  }
LG>}
LG>


LG>Как это сделать?


В Обероне запросто:
LOOP
  (* ... *)
  FOR i := 0 TO 99 DO
    (* ... *)
    IF i = 77 THEN EXIT END;
    (* ... *)
  END;
  (* ... *)
END;

EXIT — оператор выхода из цикла LOOP

Чтобы получить подобный эффект в доисторическом языке программирования Си, для этого цикла заведите отдельную функцию:
void Cycle()
{
  //...
  while(1)
  {
    //...
    for(int i = 0; i < 100; i++)
    {
      //...
      if(i == 77) return;
      //...
    }
    //...
  }
  //...
}

Оператор return будет выбрасывать из любого количества вложенных циклов.
Re[2]: Выйти из двух циклов сразу
От: eugals Россия  
Дата: 15.09.04 17:28
Оценка:
Здравствуйте, little_alex, Вы писали:

_>Если Perl

Раз пошла такая пьянка...
Если Python, то так:
while True:
    for i in xrange( 0, 100):
        if i == 77:
            break
    else:
        continue
    break

... << RSDN@Home 1.1.4 beta 2 >>
Re[2]: Выйти из двух циклов сразу
От: Laurel  
Дата: 16.09.04 06:34
Оценка:
Здравствуйте, little_alex, Вы писали:

_>Здравствуйте, LeonGorbachev, Вы писали:




LG>>
LG>>while(1)
LG>>{
LG>>  for(int i = 0; i < 100; i++)
LG>>  {
LG>>    if(i == 77)
LG>>      // вот тут хочу выйти вообще из всех циклов - из  for и из while
LG>>  }
LG>>}
LG>>


_>Если Perl

_>
_>OUT:while(1)
_>{
_>   for(0..100)
_>   {
_>      if($_ eq 77) break OUT;
_>   }

_>}
_>


Если память мне не изменяет в java также допустим синтаксис
break [<имя цикла>]
continue [<имя цикла>]

А в С/С++ допустимо для этого использовать goto.
Опять же если память мне не изменяет Страуструп об этом писал, хоть и неохотно.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Выйти из двух циклов сразу
От: hrg Россия  
Дата: 16.09.04 08:33
Оценка:
little_alex -> "Re: Выйти из двух циклов сразу" :

la> Если Perl

la>
 la> OUT:while(1)
 la> {
 la>    for(0..100)
 la>    {
 la>       if($_ eq 77) break OUT;
 la>    }

 la> }
 la>

la> Внимание OUT- это не метка а ИМЯ цикла
la> Не сказать что Perl способствует построению читабельных программ ,
la> но это то что мне не хватает в др. языках

Мда.... докатились до goto... позор


my $_continue=1;

while($_continue){
    for(0..100){
        $_continue=1 if($_ eq 77) ;
    }
}



Yury Kopyl aka hrg | http://id.totem.ru | "мы не пьем — мы лечимся..."
Posted via RSDN NNTP Server 1.9 gamma
Re[2]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 16.09.04 14:01
Оценка:
Здравствуйте, S.Yu.Gubanov, Вы писали:


SYG>Чтобы получить подобный эффект в доисторическом языке программирования Си

с "доисторическим" поосторожнее
а то ведь и нам лексикона хватит оберон обругать

SYG>для этого цикла заведите отдельную функцию:

SYG>Оператор return будет выбрасывать из любого количества вложенных циклов.

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

предлагаешь объявлять функцию с 20 аргументами?
или объявлять 20 глобальных переменных?
или объявить класс (если это С++ или java, а не С), членами которого будут эти 20 переменных, специально lzk этого вложенного цикла?
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Выйти из двух циклов сразу
От: Undying Россия  
Дата: 16.09.04 14:54
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>к большому сожалению, циклы редко пишутся отдельно от остального кода.

J>обычно в них используется штук 20 внешних по отношению к циклу переменных.

Если внутри цикла используется 20 переменных, значит, давно пора провести рефакторинг, после которого в цикле останутся вызовы нескольких функций, т.к. иначе никто быстро в использовании 20 переменных не въедет.
... << RSDN@Home 1.1.2 stable >>
Re[4]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 17.09.04 06:26
Оценка: 4 (1)
Здравствуйте, Undying, Вы писали:

U>Здравствуйте, jazzer, Вы писали:


J>>к большому сожалению, циклы редко пишутся отдельно от остального кода.

J>>обычно в них используется штук 20 внешних по отношению к циклу переменных.

U>Если внутри цикла используется 20 переменных, значит, давно пора провести рефакторинг, после которого в цикле останутся вызовы нескольких функций, т.к. иначе никто быстро в использовании 20 переменных не въедет.


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

Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.

рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: Выйти из двух циклов сразу
От: S.Yu.Gubanov Россия http://sergey-gubanov.livejournal.com/
Дата: 17.09.04 06:54
Оценка:
Здравствуйте, jazzer, Вы писали:

J>предлагаешь объявлять функцию с 20 аргументами?


Факт: В языках Си/Си++ не предусмотрена структурная инструкция выхода из нескольких циклов.
Варианты решения этой проблемы не уменьшающие быстродействия программы:
1) Забыть о дисциплине программирования и использовать неструктурную инструкцию goto.
2) Эмулировать инструкцию выхода из нескольких циклов структурной инструкцией return — выхода из функции.
3) Сменить язык программирования на более современный, например Oberon, в котором есть структурная инструкция EXIT с помощью которой можно выйти из нескольких вложенных циклов.
Re[5]: Выйти из двух циклов сразу
От: prVovik Россия  
Дата: 17.09.04 06:56
Оценка: +1 -2
Здравствуйте, jazzer, Вы писали:


J>Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.

Кривой дезайн. Что тут можно поделать? Ответ напрашивается сам собой...


J>рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления

Совершенно верно, звучания недостаточно. Необходимо, как минимум, применение.
... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[4]: Выйти из двух циклов сразу
От: prVovik Россия  
Дата: 17.09.04 07:17
Оценка: 18 (1) :))) :)))
Здравствуйте, S.Yu.Gubanov, Вы писали:

SYG>Здравствуйте, jazzer, Вы писали:


J>>предлагаешь объявлять функцию с 20 аргументами?


SYG>Факт: В языках Си/Си++ не предусмотрена структурная инструкция выхода из нескольких циклов.

SYG>Варианты решения этой проблемы не уменьшающие быстродействия программы:
SYG>1) Забыть о дисциплине программирования и использовать неструктурную инструкцию goto.
SYG>2) Эмулировать инструкцию выхода из нескольких циклов структурной инструкцией return — выхода из функции.
SYG>3) Сменить язык программирования на более современный, например Oberon, в котором есть структурная инструкция EXIT с помощью которой можно выйти из нескольких вложенных циклов.

-- Хвала оберону!!!Джихад неверным!
Но однажды на пути войнов оберона стали войны функциональных языков
-- Да мы за функциональные языки всех на ремни порвем!
А потом подтянулись войны дотнета
-- Сила в доднете! Пусть мы погибнем, но мы погибнем, как герои. ЗА ДОТНЕТ В АТАКУ!!!!!!!

И никто никому не хотел уступить. И начался бой... Кровавый бой... беспощадный...
И когда битва дошла до небес, великий Гейтс увидел, что силы равны. И если не остановить бой, погибнут все. И он остановил бой.




Смотрите в кинотеатрах, новый блокбастер: ПлюсПлюс Дозор

ПлюсПлюс Дозор. Всем выйти из фреймворка!

... << RSDN@Home 1.1.4 @@subversion >>
лэт ми спик фром май харт
Re[6]: Выйти из двух циклов сразу
От: jazzer Россия Skype: enerjazzer
Дата: 17.09.04 07:34
Оценка:
Здравствуйте, prVovik, Вы писали:

V>Здравствуйте, jazzer, Вы писали:



J>>Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.

V>Кривой дезайн. Что тут можно поделать? Ответ напрашивается сам собой...

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

только вот реальный мир несколько сложнее, и реальные задачи отнюдь не всегда оказываются легко разложимыми на составляющие

большинство научных вычислительных задач именно таковы

J>>рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления

V>Совершенно верно, звучания недостаточно. Необходимо, как минимум, применение.
пример, пожалуйста, применения для озвученного случая
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.