
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.217.2] |
![]() |
|
Сообщ.
#1
,
|
|
|
Привет
сегодня читал одну книжку, так там написанно, что break это плохой вариант выхода из циклов? |
Сообщ.
#2
,
|
|
|
По Страуструпу - совершенно нормальный вариант. Вот goto - да, эт нехорошо.
|
Сообщ.
#3
,
|
|
|
Чем goto не нравится. Делает jamp addr и всё, а бряк то только из текущего цикла выходит...
|
Сообщ.
#4
,
|
|
|
Ну, не рекомендуют goto пользоваться практически все. Типа, приводит к каким-то трудноотлавливаемым проблемам и вообще плохой стиль программирования. А вообще - фиг его знает.
|
Сообщ.
#5
,
|
|
|
Goto-наследие фортрана IV с васюком. В совремнных диалектах этих языков практически не используется, в С - тем более. Глюки были возможны в сегментированновых моделях памяти, для плоских моделей их быть не должно в приципе, по крайней мере внутри страницы 2Г. Насчёт плохого тона-не уверен, довольно часто один goto позволяет отказаться от кучи if-else....
|
Сообщ.
#6
,
|
|
|
да не любят некоторые такого.
по мне break впоолне нормальный:)) да и goto тоже. как иначе ты выйдешь из внутреннего цикла. так придется усложнять условия циклов и переменные лишние вводить.. просто не надо эти злоупотреблять:)) ЗЫ как они еще return в середине проги не обьявили плохим стилем...? ![]() |
Сообщ.
#7
,
|
|
|
Вот-вот.
А плохой тон goto, потому что если их много накручено то программа нечитаемая становится. А так - иногда лучше действительно поюзать. Вон, на асме люди юзают же джампы - и ничего, не жалуются ![]() ![]() |
Сообщ.
#8
,
|
|
|
2DemoS -
а может лучше try { trow () } catch () { } Чем goto городить ? По крайней мере в тех случаях, что ты имееш ввиду - преждевременный выход ? |
Сообщ.
#9
,
|
|
|
конечно в некоторых случаях лучше.
но не всегда. это дя исключений. а вот тебе простой пример: надо найти в файле в четных строках символ "в" и заменить его на V, замену првоести до первоговхождения символа "Х" два цикла while(!feof(f)) { //читаем строку fread(buf,80,1,f); fwrite(buf,80,1,fdest); fread(buf,80,1,f);//читаем строку два раза чтобы пропустить нечетную. for(i=0;i<80;i++) { if(buf[i]=='в')buf[i]='v'; if(buf[i]='X') goto _end; } } _end: //закрываем файлы. тут эксепшины как то не очень хочется использовать, тк нет исключительных ситуаций, а без goto нужно было бы вводитье еще один флаг, чтобы внешний и внутренний цикл при выставлении этого флага в 0 переставал работать. при этомнужно переделать внутренний в while. и когда нашли Х нужно выставлять этот флаг в 0. что менее читаемо чем один goto. согласен, пример притянут за уши и оптимизацией от goto можно уйти, но так получается не всегда и реально встречаются задачи, где надо или плодить разный условие (особеннов в циклах) или один раз вставить goto. ЗЫ это моя 251 мессага:))) крута:))) теперь уже буду сеньор:) |
Сообщ.
#10
,
|
|
|
да жиру они все бесятся, я когда на васике писал, и на сях везде вставлял goto вместо while
![]() |
Сообщ.
#11
,
|
|
|
Ну, ежели в самом микрософте не чураются goto, то уж нам-то тем более не зазорно заюзать ;D
Это из МСДН-а: ![]() ![]() case WM_MOUSEWHEEL: /* * Don't handle zoom and datazoom. */ if (wParam & (MK_SHIFT | MK_CONTROL)) { goto PassToDefaultWindowProc; // :) } |
Сообщ.
#12
,
|
|
|
goto - это не стильно. вот и всё. ;)
|
Сообщ.
#13
,
|
|
|
Все эти измышления структурных программёров 70-80х годов - коффно!
Якобы нужна читабельность программ(murph). Итак все читается! Мгут быть некоторые неудобства при внесении корректировки в исходный текст проги, но не более. Если бы можно было обойтись без этих операторов, то их давно бы убрали из языков. Но этого не произошло за последние 30-20 лет. Значит, они реально необходимы. Поэтому не страдай. Стиль стилем, но и пидoры у нас, обычно, тоже стильные чуваки! ;D То есть, тупо придерживаясь стиля можно, в конце концов, сотворить прогу в которой все будет через жoпy. |
Сообщ.
#14
,
|
|
|
goto рулит!! ;D ;D
![]() ![]() while(!feof(f)) { //читаем строку fread(buf,80,1,f); fwrite(buf,80,1,fdest); fread(buf,80,1,f);//читаем строку два раза чтобы пропустить нечетную. for(i=0;i<80;i++) { if(buf[i]=='в')buf[i]='v'; if(buf[i]='X') goto _end; } } _end: //закрываем файлы. тут вообще можно без for и while обойтись;D ![]() ![]() _while: if(feof(f)) goto _end; //читаем строку fread(buf,80,1,f); fwrite(buf,80,1,fdest); fread(buf,80,1,f);//читаем строку два раза чтобы пропустить нечетную. i=0; _for: if(i >= 80) goto _while; if(buf[i]=='в')buf[i]='v'; if(buf[i++]='X') goto _end; goto _for; _end: //закрываем файлы. |
Сообщ.
#15
,
|
|
|
2m:
пример сишный, в нем почему бы и нет. в плюсах с goto возникают проблемы, когда он обходит инициализацию автоматических переменных. об этом же и Старуструп говорит. |
Сообщ.
#16
,
|
|
|
Цитата Demo_S, 16.05.02, 16:57:05 да не любят некоторые такого. по мне break впоолне нормальный:)) да и goto тоже. как иначе ты выйдешь из внутреннего цикла. так придется усложнять условия циклов и переменные лишние вводить.. просто не надо эти злоупотреблять:)) ЗЫ как они еще return в середине проги не обьявили плохим стилем...? ![]() Так вот получается return хреново по середине процедуры, я тут прогу на си правлю, так в одной функции мне память надо выделить в начале, а при завершении освободить, а тут return около восьми штук, ну и што мне прикажете делать? Возле каждного return free писать? Зараза, слов нету. |
Сообщ.
#17
,
|
|
|
Мое скромное мнение состоит в том, что goto, в принципе, приемлим в С, но в С++ - это не просто "не стильно", это отвратительно, если среди 40 строк кода, принадлежащего циклу вдруг стоит goto за пределы - это "ужас, летящий на крыльях ночи" для изменения кода. Скажем, я просматириваю чужой код, я вижу цикл, в условиях цикла описано то, что гарантирует выполнение цикла (например, i<max), я ничего не подозреваю, пропускаю цикл (поглядывая, а нет ли break-ов) и продолжаю рассматривать прогу, потом выясняется, что внутри цикла было два goto и один return, что получилось, что я каждый раз вынужден просматирвать КАЖДУЮ строчку кода на предмет всяческих засад со стороны ленивых программеров. Результат: несравнимо большие потери времени, чем на внедрение читабельных флагов. Писать goto (а за одно и несколько return'ов) можно в лабораторных работах, курсовиках и даже в дипломах, но за goto в промышленной разработкe софта - просто выгоняют с работы, пожалуй кроме RТ, и то - не известно. Если был потерян день на поиск бага из-за нечитабельности программы - это прямая вина программиста. Время на неоптимизированную разработку без goto и с дополнительными переменными + отладка сложных ситуаций всегда меньше, чем время на разработку проги-лапшы с goto + отладка сложных ситуаций, потому, что с появлением goto все ситуации становятся сложными. Хорошая прога - это не та прога, которая красиво и быстро работает, а та, в которую можно быстро и эффективно внести изменения не повлияв на красоту и быстродействие, имеется ввиду не кнопки и окошки, а изящество кода.
2m: примерно в это же самое тебе прога и скомпилируется. 2the_moon: я 200\% тебя поддерживаю. Лучше 20 вложенных if-ов (это хотя бы читается), чем 20 return'ов, перед которыми вдруг стало необходимым вписывать освобождение памяти, а если надо еще закрывать файлы/отправлять сообщения/опрашивать потоки/... Такие дикие внедрения одинакового кода рискуют стать больше, чем вся математика в функции. 2Drunkard: есть ANSI стандарт, который трудно поправить, нарушив back-compatibility. Эк меня развезло ![]() |
Сообщ.
#18
,
|
|
|
В догонку:
break - отличный стиль программирования, если все break идут один за другим в одной область цикла, но еще одна переменная + continue - лучше, потому, что место, где прерывается цикл, становиться единственным. break - просто офигительный стиль программирования, если пользоваться оператором case ![]() Все вышесказанное является моим собственным мнением и не должно быть воспринято как наезд на других. У каждого свой опыт, свои стили разработки программ/проектов и свои отрасли применения написанного софта. На свой опыт и надо полагаться. Это - мой ![]() |
Сообщ.
#19
,
|
|
|
Ну пока я выкрутился макросом, типа FINALIZE_WORK_END_RETURN
|
Сообщ.
#20
,
|
|
|
А мне так break очень даже нравится
![]() ![]() ![]() ![]() if (a>5) { if (b>3) goto _SupperPupperLabel; c=x+a; ... if (c<8) goto _SupperPupperLabel; ... } _SupperPupperLabel: ... заменять на более элегантное: ![]() ![]() while (a>5) { if (b>3) break; c=x+a; ... if (c<8) break; ... break; } Кстати, и goto не путает, и прграмма читабельнее, так ведь? ![]() ![]() ![]() ![]() |
Сообщ.
#21
,
|
|
|
Цитата bin, 24.05.02, 11:35:05 большие потери времени, чем на внедрение читабельных флагов. Писать goto (а за одно и несколько return'ов) можно в лабораторных работах, курсовиках и даже в дипломах, но Ну, насчет goto - согласен, но вот несколько return'ов, имхо, ничего страшного. Зачастую это гораздо читабельнее, нежели куча вложенных if'ов... |
Сообщ.
#22
,
|
|
|
На мой взгляд, это пустой базар что лучше - goto или многочисленные goto-заменители!
Я встречал и бессмысленное использование goto так же часто, как до смешного извращенческий выход из цикла. Думаю, это вопрос из серии : Win или Lin, Visual или Borland ... Каждый сам для себя решает такие вопросы, руководствуясь только личными предпочтениями. |
Сообщ.
#23
,
|
|
|
И еще (в догонку) - каждый волен сам решать, какую стратегию выбрать для разработки алгоритма и программы. Да, конечно - красивый код - это хорошо. Но еще лучше, когда он не только красивый, но еще и эффективный. И при выборе - 20 if'ов или один goto или break в ряде случаев лично я выберу goto. Только поставлю перед ним комментарий с развернутым обоснованием, что он здесь делает. А производительность, зачастую, приходится поднимать на порядки... Кстати, вермешели из if'ов и case'ов на несколько экранов тоже не очень-то воспринимаются.
|
Сообщ.
#24
,
|
|
|
А в
switch (...) { case: ... } вообще без break не обойтись. Или я не прав ? Не прервешь после нужного case, так начнет все, что в остальных case'ах, срабатывать. ![]() А гоуту я терпеть не могу, однажды разбирался в _своей же_ проге, написанной очень давно, так весь день матерился. Именно из-за них, родимых, и матерился. После того goto не юзаю... ![]() |
Сообщ.
#25
,
|
|
|
2JoeUser:
я бы сказал, что тут читабельнее было бы: if (cond1) exp2; else if (cond2) exp2; else if (cond3) exp3; else exp4; 2reporter: в switch'ах без break не обойтись, ну разве что goto, но я никогда не пробывал ;D |
Сообщ.
#26
,
|
|
|
bin: Этак можно дойти до того, что все циклы исключительно через while писать - читабельность будет офигенная - в глазах не пестрит от обилия ключевых слов и т. д. и т. п. Ко всему надо подходить разумно - к читабельности кода тоже. Многострочный switch лично я никогда не замень на if хотябы по той простой причине, что переходы по switch оптимизируются компилятором. А читать их не менее удобно - каждый вариант отделен от другого.
|
Сообщ.
#27
,
|
|
|
2Flex_Ferrum:
А там не сверяется с константой, поэтому switch неприменим, привожу полностью: Цитата А мне так break очень даже нравится Я вот тут слышал что while заменяют if'ами. Предлагаю наоборот Немного смущает что брэйком нельзя из if выходить. Но мне-то он нравится, вот я и предлагаю в простых случаях следующий код: if (a>5) { if (b>3) goto _SupperPupperLabel; c=x+a; ... if (c<8) goto _SupperPupperLabel; ... } _SupperPupperLabel: ... заменять на более элегантное: while (a>5) { if (b>3) break; c=x+a; ... if (c<8) break; ... break; } Кстати, и goto не путает, и прграмма читабельнее, так ведь? Просто "if() goto" мне кажеться хуже, чем "if() else if ". А в остальном согласен. ![]() |
Сообщ.
#28
,
|
|
|
Цитата bin, 26.05.02, 12:35:40 2JoeUser: я бы сказал, что тут читабельнее было бы: if (cond1) exp2; else if (cond2) exp2; else if (cond3) exp3; else exp4; 2reporter: в switch'ах без break не обойтись, ну разве что goto, но я никогда не пробывал ;D Неправда Ваша! ![]() ![]() ![]() ![]() |
Сообщ.
#29
,
|
|
|
Ну, братцы, вы и наворочали! Некоторые, типа Drunkard, вообще покусились на структурное программирование, видимо опыта программирования маловато или всё больше по мелочи, да на однодневную прогу.
По существу. Против goto в своё время выступил Винер, отец структурного программирования, которое актуально и ныне. Структурное программирование было создано для математического доказательства правельной работы программного продукта. Было показано, что все программы можно создать испльзуя три конструкции, какие вы знаете. Любые другие конструкции усложняли понимание программ, приводили к различным типам ошибок, и делали невозможным строгий анализ программы. Goto был самым поганным, он превращал прогу в спагетти, попробуй отследи все переходы. В реальном программирование goto применяется и будет применяться. Есть эмперическое правило,- "применить goto, если он сокращает длину кода и переход происходит вниз не более, чем на 10 строк". И ещё. Не путайте структурное программирование и стиль программирования. У них есть общие задачи - увеличение надёжности работы программы, но это разные вещи. Отступы (лесенка), венгерская нотация, комментарии - это стиль программирования, который не имеет отношения к структурному программированю. "Стиль" - это слог, манера написания программы. Хороший стиль программирования отличает программиста от ламера. Для тех кто косит на Запад, сообщу, что программистов, кторые не используют комментарии в своих программах - увольняют. |
Сообщ.
#30
,
|
|
|
А вообще какая разница?? Плохой-неплохой и черт с ним! Всегда удивляюсь: один скажет глупость (мол плохой стиль программирования) и все остальные (ламеры в основном) начинают повторять за ним. Своей точки зрения то нету... А если бы это было так плохо, то зачем их (goto, break) придумали??
Полностью согласен: на ASMе пишут (jmp, jnz, ...) и не жалуются. |
Сообщ.
#31
,
|
|
|
Что за фигня!!! Теме год уже >:(
2grandpa>> В этом разделе достаточно тем намного актуальней и свежей, на которые ты можешь ответить. Если знаний хватит! 8D 2Leprecon>> Сорри за полный оффтоп :-/ |
Сообщ.
#32
,
|
|
|
Плохой стиль - с первого раза программу без ошибок написать.
А использовать break goto etc... в целях оптимизации Нет ничего плохого |
Сообщ.
#33
,
|
|
|
Разница между плохим и хорошим стилем огромная. Попробуйте прочитать этот текст выполненый в плохом стиле:
Ес личто-тодел ается,этодолжноделатьсяоднообразно. Кстати,хорошийст иль программированияосно вываетсянаоднообразииме тодов,опи саний,спо соба кодированияит.д.Человек,которыйсна чалапишетClose WindowEx,потомclosewin dowex,а потомCloseWindowex,приэтомпо стоянноменя я ширинуотступов и т.п -неимеет хорошегости ля програ ммиро вания, пото мучтоне имеет сти ля вообще. И тот же текст в общепринятом стиле: Если что-то делается, это должно делаться однообразно. Кстати, хороший стиль программирования основывается на однообразии методов, описаний, способа кодирования и т.д. Человек, который сначала пишет CloseWindowEx, потом closewindowex, а потом CloseWindowex, при этом постоянно меняя ширину отступов и т.п - не имеет хорошего стиля программирования, потому что не имеет стиля вообще. Вот так и с программами. |
Сообщ.
#34
,
|
|
|
[quote author=AlexSm]Что за фигня!!! Теме год уже[/quote]То-то я думаю - почему я такой рьяной дискуссии не заметил в своем разделе.
[quote author=AlexSm]2grandpa>> В этом разделе достаточно тем намного актуальней и свежей, на которые ты можешь ответить. Если знаний хватит! [/quote]Выношу grandpa предупреждение. Не только за то что поднял старую тему, но еще и за флейм. [quote author=AlexSm]2Leprecon>> Сорри за полный оффтоп [/quote]Нестрашно - правильное мнение выразил. ГЫ. Drunkard, Не буду ставить тебе звездочку за "нехорошее слово" - теме то уже год ;D |