Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, folk, Вы писали:
F>Выйти из двух циклов сразу — это фигня. Вот зайти — для настоящих профессионалов. F>Как вы это обычно делаете? WH>Нууу.... Как бы тебе сказать.....
Здравствуйте, 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,
...
Здравствуйте, 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...
Здравствуйте, eaa, Вы писали:
eaa>Здравствуйте, Areex, Вы писали:
A>>Нади отличие. Догадки блин... eaa>Ну начнём с простого там написано goto там break
Очевидно, что имелось ввиду логическое отличие.
eaa>while(a) eaa>{ eaa> a=false; eaa>} eaa>это тоже неявный goto?
eaa>то что break можно заменить goto не значит что это одно и тоже. Можно ведь все циклы заменить goto...
Это эпидемия или теперь модно книжек не читать? goto это безусловный переход. while это безусловный переход? Детский сад блин.
В общем все это уже переосло в непотребный флейм, к тому же в этой ветку уже все много раз сказали, я завязываю, выходите из цикла по throw, если вам так больше нравится.
Здравствуйте, Les, Вы писали:
Les>Здравствуйте, WolfHound, Вы писали:
WH>Здравствуйте, folk, Вы писали:
F>Выйти из двух циклов сразу — это фигня. Вот зайти — для настоящих профессионалов. F>Как вы это обычно делаете? WH>Нууу.... Как бы тебе сказать.....
Les>ИМХО, всю эту ветку давно пора в "Юмор"
Здравствуйте, Areex, Вы писали:
A>Я не про то. Если ты пользуешся break&continue, ты используешь goto, путь и не явно. Следовательно ни о каком исключении goto из программ и речи быть не может. A>Использование же специальных конструкций для того, что бы избежать goto, есть ни что иное как победа догм над здравым смыслом. Я тут почитал всю ветку, над пёрлами типа throw рыдал просто. Нет, что бы придумать конструкцию, когда от goto избавляться не надо. Я в общем с паталогом согласен, на 100%.
IMHO? проблема не в том ка goto работает, а насколько читабельны программы с goto. Т.е. получается так называемы "spagetti code". Да, теоретически, повышается читабельность программы, где при выходе из вложенных циклов используется goto, в небольших циклах. Также бытует мнение, что целесообразно использование goto в функциях, повышает не только читабельность но и логичность, функция всегда завершается в определенном месте, а значит не надо искать окончание функции по всему коду:
Но при всем при этом я не сторонник goto! считайте это религией... мои доводы:
Потенциальная сложность программы увеличивается при использовании в ней дополнительных ключевых слов. Плюс, логика программы становиться странноватой, т.к. приводит к использованию goto и break совместно, как бы параллельно.
Если весь текст цикла умещается на экране, зачем использовать goto, а если — нет, то я сомневаюсь что при использовании получится явное преимущество. Как тот, кто будет читать вашу программу поймет, не видя цикл целиком, куда ведет goto? По имени метки? Вед главный довод goto в читабельности, по сравнени с break, и то, что у goto нет никакой связи с операторами циклов, портит ему всю "малину".
Для большого числа вложенных циклов я вообще рекоммендую пересмотреть алгоритм. Применение goto очень часто приводит к более широкому его использованию, т.е. в следствие редактирования программы с этими операторами есть опасность, что получиться "spagetti code" в попытке внести минимум изменений.
В конечном итоге: есть комментарии которые неплохо было бы расставлять в таких местах, чтоб не забыть, что здесь происходит.
Так, что я продолжу не прибегать к использованию goto в своих программах. Ну, может быть, на сверх крайний случай.
Здравствуйте, 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 в своих программах. Ну, может быть, на сверх крайний случай.
Применять надо не на крайний случай, не где попало, а только там где уместно. Как собственно и любую вещь.
LG>while(1)
LG>{
LG> for(int i = 0; i < 100; i++)
LG> {
LG> if(i == 77)
LG> // вот тут хочу выйти вообще из всех циклов - из for и из while
LG> }
LG>}
LG>
Внимание OUT- это не метка а ИМЯ цикла
Не сказать что Perl способствует построению читабельных программ ,
но это то что мне не хватает в др. языках
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....
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
Чтобы получить подобный эффект в доисторическом языке программирования Си, для этого цикла заведите отдельную функцию:
Здравствуйте, 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>>
la> Внимание OUT- это не метка а ИМЯ цикла la> Не сказать что Perl способствует построению читабельных программ , la> но это то что мне не хватает в др. языках
SYG>Чтобы получить подобный эффект в доисторическом языке программирования Си
с "доисторическим" поосторожнее
а то ведь и нам лексикона хватит оберон обругать
SYG>для этого цикла заведите отдельную функцию: SYG>Оператор return будет выбрасывать из любого количества вложенных циклов.
к большому сожалению, циклы редко пишутся отдельно от остального кода.
обычно в них используется штук 20 внешних по отношению к циклу переменных.
предлагаешь объявлять функцию с 20 аргументами?
или объявлять 20 глобальных переменных?
или объявить класс (если это С++ или java, а не С), членами которого будут эти 20 переменных, специально lzk этого вложенного цикла?
Здравствуйте, jazzer, Вы писали:
J>к большому сожалению, циклы редко пишутся отдельно от остального кода. J>обычно в них используется штук 20 внешних по отношению к циклу переменных.
Если внутри цикла используется 20 переменных, значит, давно пора провести рефакторинг, после которого в цикле останутся вызовы нескольких функций, т.к. иначе никто быстро в использовании 20 переменных не въедет.
Здравствуйте, Undying, Вы писали:
U>Здравствуйте, jazzer, Вы писали:
J>>к большому сожалению, циклы редко пишутся отдельно от остального кода. J>>обычно в них используется штук 20 внешних по отношению к циклу переменных.
U>Если внутри цикла используется 20 переменных, значит, давно пора провести рефакторинг, после которого в цикле останутся вызовы нескольких функций, т.к. иначе никто быстро в использовании 20 переменных не въедет.
что-то я не понял, каким образом можно введением новых функций избавиться от переменных.
Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.
рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления
Здравствуйте, jazzer, Вы писали:
J>предлагаешь объявлять функцию с 20 аргументами?
Факт: В языках Си/Си++ не предусмотрена структурная инструкция выхода из нескольких циклов.
Варианты решения этой проблемы не уменьшающие быстродействия программы:
1) Забыть о дисциплине программирования и использовать неструктурную инструкцию goto.
2) Эмулировать инструкцию выхода из нескольких циклов структурной инструкцией return — выхода из функции.
3) Сменить язык программирования на более современный, например Oberon, в котором есть структурная инструкция EXIT с помощью которой можно выйти из нескольких вложенных циклов.
J>Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся.
Кривой дезайн. Что тут можно поделать? Ответ напрашивается сам собой...
J>рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления
Совершенно верно, звучания недостаточно. Необходимо, как минимум, применение.
Здравствуйте, S.Yu.Gubanov, Вы писали:
SYG>Здравствуйте, jazzer, Вы писали:
J>>предлагаешь объявлять функцию с 20 аргументами?
SYG>Факт: В языках Си/Си++ не предусмотрена структурная инструкция выхода из нескольких циклов. SYG>Варианты решения этой проблемы не уменьшающие быстродействия программы: SYG>1) Забыть о дисциплине программирования и использовать неструктурную инструкцию goto. SYG>2) Эмулировать инструкцию выхода из нескольких циклов структурной инструкцией return — выхода из функции. SYG>3) Сменить язык программирования на более современный, например Oberon, в котором есть структурная инструкция EXIT с помощью которой можно выйти из нескольких вложенных циклов.
-- Хвала оберону!!!Джихад неверным!
Но однажды на пути войнов оберона стали войны функциональных языков
-- Да мы за функциональные языки всех на ремни порвем!
А потом подтянулись войны дотнета
-- Сила в доднете! Пусть мы погибнем, но мы погибнем, как герои. ЗА ДОТНЕТ В АТАКУ!!!!!!!
И никто никому не хотел уступить. И начался бой... Кровавый бой... беспощадный...
И когда битва дошла до небес, великий Гейтс увидел, что силы равны. И если не остановить бой, погибнут все. И он остановил бой.
Смотрите в кинотеатрах, новый блокбастер: ПлюсПлюс Дозор
Здравствуйте, prVovik, Вы писали:
V>Здравствуйте, jazzer, Вы писали:
J>>Если у меня цикл работает сразу с десятью массивами/хэшами/листами, перелопачивая в них информацию, используя еще десяток (хорошо, если так) внешних параметров перелопачивания этой самой информации — никаким введением новых функций количество контейнеров и параметров изменить не удастся. V>Кривой дезайн. Что тут можно поделать? Ответ напрашивается сам собой...
что угодно можно обозвать кривым дизайном
было бы, конечно, здорово, если бы все задачи были простыми и укладывались в простые диаграммы с очевидной логикой
только вот реальный мир несколько сложнее, и реальные задачи отнюдь не всегда оказываются легко разложимыми на составляющие
большинство научных вычислительных задач именно таковы
J>>рефакторинг, конечно, — клёвое, модное и красивое слово, но его звучания недостаточно, чтобы делать такие заявления V>Совершенно верно, звучания недостаточно. Необходимо, как минимум, применение.
пример, пожалуйста, применения для озвученного случая