Здравствуйте, Codealot, Вы писали:
C>Общался тут с одним чуваком по поводу ревью кода, и он не понимает, что такое цикл с выходом из середины. Вообще не знает, что это такое и зачем может быть нужно. C>Остается только гадать, как с такими знаниями можно пройти все эти зубодродительные алгоритмические собеседования. Ну и в свете этих идей о взаимозаменяемости всех, я вообще не хочу видеть код, который этот чувак может написать.
А это не нужно. IMHO выход из середины цикла (break) хреновая конструкция, запутывающая код, может это даже хорошо что он ее не знает.
Выходить надо или сразу, или разбивать код внутри на две функции. Выходить из середины — это goto по сути, в худшем его проявлении
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Здравствуйте, Pzz, Вы писали:
Pzz>>Сейчас неожиданно окажется, что полфорума не понимают эту запись, но стесняются сказать.
SVZ>Тогда я, пожалуй, сохраню интригу
Правильно. Нам еще до пенсии тянуть
Общался тут с одним чуваком по поводу ревью кода, и он не понимает, что такое цикл с выходом из середины. Вообще не знает, что это такое и зачем может быть нужно.
Остается только гадать, как с такими знаниями можно пройти все эти зубодродительные алгоритмические собеседования. Ну и в свете этих идей о взаимозаменяемости всех, я вообще не хочу видеть код, который этот чувак может написать.
Здравствуйте, Codealot, Вы писали:
Pzz>>должен хотя бы понимать, что такое "теоретически правильный" код, и зачем он такой нужен.
C>"Теоретически правильный" в понимании сектантов.
Теорию знать не вредно. Если я тебя правильно понимаю, сектанство — это когда знание теории заменяют карго-культом. Но это не отменяет ценность сознательного понимания теории.
C>В любом случае, специалист должен знать реалии, а не только свои представления о правильности.
Хороший специалист обладает развитыми когнитивными картами. Это значит, что он знает или может придумать много правильных решений и сознательно выбирать из них наиболее подходящее, с оглядкой на конкретную ситуацию.
Здравствуйте, Kernan, Вы писали:
Pzz>>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен. K>Почему?
Потому, что суть структурного программирования заключается в том, что у программы есть структура, состоящая из стандартных "строительных" блоков: операторов if-then-else и операторов циклов. И заметим, у каждого такого блока есть ровно одна входная и ровно одна выходная точка.
Такую программу гораздо проще анализировать, и мозгами и автоматическим способом.
"цикл с выходом из середины" — лексика странная. Чел вполне мог не понять. Особенно, если чел читает книги на Инглише, а тут .... "цикл с выходом из середины" — я тож такую формулировку впервые слышу...
Может "прерывание цикла" было бы понятнее?
Здравствуйте, fk0, Вы писали:
fk0> Я отчасти с ним согласен. break -- по-сути есть замаскированный goto, нарушающий принципы структурного программирвоания.
А циклы сами по себе — это тоже по сути замаскированные goto/jmp.
Как с ними не нарушать принципов структурного программирования?
Здравствуйте, bnk, Вы писали:
bnk>А это не нужно. IMHO выход из середины цикла (break) хреновая конструкция, запутывающая код, может это даже хорошо что он ее не знает. bnk>Выходить надо или сразу, или разбивать код внутри на две функции. Выходить из середины — это goto по сути, в худшем его проявлении
Угу. Пол итерации в одной функции, пол итерации — в другой. Классная локальность выходит, все прям совсем рядом и по смыслу становится сразу понятно, что там происходит
И это пришет чел, для которого break — когнитивная нагрузка.
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, baxton_ulf, Вы писали:
_>>да конечно, можно не знать. не пройдёшь интервью да и только
C>Лишнее напоминание, насколько вопросы на собеседованиях высосаны из пальца.
это не просто знание как имплементирована atoi или parseInt — это паттерн, который может сделать твою программу быстрее и занимать меньше памяти.
мне приходилось в реальной работе применять навыки выработанные при решении задач для интервью. даже так — постоянно приходится применять. а разве тебе не помогает знание, например того, что с отсортированными коллекциями работать быстрее во многих задачах. или знание, например merging-sort — это ведь тоже паттерн, который во многих задачах применим. не только для сортировки больших коллекций.
пример из практики: лет, наверное 20 назад я видел программу намертво висящую потому, что обрабатывала коллекцию из 50К записей со сложностью O(N^2) если бы те программисты практиковали решение задач, которые "высосаны из пальца", то их алгоритм просто бы летал, а не висел по пол дня.
как то так. а ты все "из пальца" да "из пальца"
Здравствуйте, Codealot, Вы писали:
_>>есть такое правило: критикуя предлагай.
C>Да в общем то ничего сложного. Смотришь на код предыдущих проектов, к примеру. Обычно у профи есть хотя бы что-то в опен сорсе, или хобби-проекты.
Почему все считают, что у программистов есть только одно хобби — программирование???
_>>у тебя же я пока вижу не подкрепленные ничем наезды — видимо из за обидок (не взяли). и никаких конструктивных предложений
C>Пф. Тупейший аргумент. Проходил такие собесы не раз, и обычно чем больше понтов на собесе, тем бестолковее компания.
Коли проходил не раз, то и проблем возникать не должно
C>А ты видимо очень гордишься, что ты превозмог и тебя взяли.
Что тут превозмогать??? Рассказываешь из своей практики, как и почему (не) применял ту или иную конструкцию. Получается очень содержательный разговор на профессиональную тему.
Вот если рассказать нечего, тогда да — проблема.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>>Хе-хе, друг мой давнишний как-то жаловался.
NB>так может и не нужно этого знать? NB>как часто может потребоваться писать такое самому?
Ну вот на днях понадобилось напиать преобразование даты-времени в строку ISO8601 в критичном по времени цикле.
Написал в подобном стиле. Работает в 40+ раз быстрее библиотечной функции.
Обратные преобразования тоже так делал.
Здравствуйте, Slawa Ms, Вы писали:
SM>Т.е., имеем цикл на 100500 итераций. На третьей получаем нужный нам результат, но все равно будем продолжать 100497 раз?
Не, оне предлагают взводить флаг, который проверится на следующей итерации в for'е.
Те же яйца, только в профиль. Зато по фэн-шую.
Но ещё, вроде как, не считается ересью return для выхода из цикла.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Codealot, Вы писали:
Pzz>>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен.
C>Какую странную ересь ты бы не исповедовал, но знать базовые конструкции языка все же нужно.
А так ты понимашь: c = 3["hello"]; ? А так: x = (f ? sin : cos)(y); ?
Здравствуйте, Osaka, Вы писали:
Pzz>>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен. O>В "структурное программирование" вроде бы это единственный приличный случай использования goto
Pzz>>Почему? Можно ж выйти по условию. Не обязательно делать goto из середины. SM>У ТС речь шла про break, по нему и выходим по условию из середины цикла. Повторяю, ситуации, когда нужно выйти из середины цикла, встречаются часто. Зачем тратить время на полный перебор? Для этого используются break и exit.
Это можно реализовать без break. Надо 2 проверки — один if внутри цикла и одна проверка в начале(конце) цикла.
Здравствуйте, Артём, Вы писали:
Pzz>>А что с делением?
Аё>Мне про такое неизвестно. Умножение строки/массива на число повторов- это стандартный и широкораспространённый приём в питоне.
Но пример был из плюсов
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, baxton_ulf, Вы писали:
_>>ну, хотя бы так. да. а мидлов как набирать? а джунов?
C>Видимо, по другому.
ну вот видишь — способ не рабочий
_>>да и думаю, если бы так набирали, то ты бы тут кричал про "что за тупейший способ" набирать
C>Ну да, что может быть тупее, чем посмотреть на реальные результаты.
это не сарказм, это "ляпнул не подумав" называется. ты предложил способ решения проблемы в очень узкой области определения. он не масштабируется и не обобщается
Pzz>>Только проверка границы. C>В копипасте. В итоге — копипасты больше, добавочные усилия чтобы понять смысл, и все это исключительно ради религиозных идей.
Это у тебя религия, а у нас — ускорение последовательного поиска методом введения барьера
Здравствуйте, LaptevVV, Вы писали:
C>>В копипасте. В итоге — копипасты больше, добавочные усилия чтобы понять смысл, и все это исключительно ради религиозных идей. LVV>Это у тебя религия, а у нас — ускорение последовательного поиска методом введения барьера
модифицировать входящий константный массив?
ты серьезно?
C>>>В копипасте. В итоге — копипасты больше, добавочные усилия чтобы понять смысл, и все это исключительно ради религиозных идей. LVV>>Это у тебя религия, а у нас — ускорение последовательного поиска методом введения барьера NB>модифицировать входящий константный массив? NB>ты серьезно?
А ты серьезно думаешь, что я не знаю, что и как надо делать.
Написан псевдокод в стиле и.
А ты его воспринимаешь как реальный код ?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, 尿컙拋㕪⬎⤇Ǥ꧃푙刾ꄔ, Вы писали:
尿Ǥ푙>очень спорное заявление. без выходов из цикла можно прекрасно обходиться. часто но не всегда — "выходы" проявление лени программиста, когда можно было не предавть избыточных вхдодных данных, но было лень считать. Всегда можно использовать while/until — это выглядит более уважительным к читателям кода, чем заставлять людей лазить по циклу и искать тот шедeвральный "Ups".
Это что же за простыни кода вы вставляете в цикл, чтобы надо было аж "лазить по циклу и искать тот шедeвральный..."(с)?
Может дело не в преждевременном break'е, а в организации кода в целом?
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, cthsq, Вы писали:
C>сто лет на квыт не заходил C>но меня порадовало когда увидел что тут всё те же люди всё так же из малюсенькой фразы раздувают километровое обсуждение) C>как будто был тут вчера
Здравствуйте, Философ, Вы писали:
Ф>break, return, goto, throw знаю, а вот "цикл с выходом из середины" — какая-то непонятная хрень. Никогда не слышал. Ф>Какой-то новый термин.
"Цикл с выходом из середины" — это то, ЧТО нужно получить, а break, return, goto и throw — это то, КАК этого можно достичь. Топик стартера в большей мере интересовало "что", а не "как", вот и все.
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Почему ты везде ищешь подвох? SVZ>Занимался фотографией, нужны были фотошоп и лайтрум. SVZ>Всё остальное доступно забесплатно или за маленькую денежку.
Ну потому что это подвох Есть еще много вариантов кроме гигантского продукта и не делать вообще ничего. Не так ли?
SVZ>Приведи свой пример, что тебе потребовалось написать руками для себя для любимого.
Да много разного. Что-то просто ради интереса. Что-то более практическое, например более удобный бэкап.
SVZ>Мой научный руководитель по совместительству был регентом церковного хора.
Тот чувак — не по совместительству. Это была его основная карьера
Здравствуйте, Codealot, Вы писали:
C>Общался тут с одним чуваком по поводу ревью кода, и он не понимает, что такое цикл с выходом из середины. Вообще не знает, что это такое и зачем может быть нужно.
Хе-хе, друг мой давнишний как-то жаловался.
12 часов потребовалось студенту, чтобы так и не понять что за магия творится в строчке:
Здравствуйте, Codealot, Вы писали:
C>Общался тут с одним чуваком по поводу ревью кода, и он не понимает, что такое цикл с выходом из середины. Вообще не знает, что это такое и зачем может быть нужно.
Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен.
Здравствуйте, Pzz, Вы писали:
Pzz>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен.
Какую странную ересь ты бы не исповедовал, но знать базовые конструкции языка все же нужно.
SVZ>12 часов потребовалось студенту, чтобы так и не понять что за магия творится в строчке: SVZ>а = (c[0] — '0') *100 + (c[1] — '0')*10 + (c[2] — '0') SVZ>и почему придуманная им инициализация char* c = {1,2,3} не работает
Минут 5 думал, что в данном контексте означает "работает".
Здравствуйте, Codealot, Вы писали:
Pzz>>А так ты понимашь: c = 3["hello"]; ? А так: x = (f ? sin : cos)(y); ?
C>Это точно не базовые конструкции языка, так что не надо мутить воду.
Здравствуйте, Codealot, Вы писали:
Pzz>>Нет.
C>Вероятно, там предложат сделать добавочный флаг для выхода и вытащить часть переменных из цикла. Но люди без склонности к сектанству так не делают.
Реальный код может быть компромиссом между "теоретически правильным" и "практически обусловленным", но как бы то ни было, специалист, претендующий на то, что он работает сознательно, а не на смеси рефлексов, подражания и карго-культа, должен хотя бы понимать, что такое "теоретически правильный" код, и зачем он такой нужен.
Здравствуйте, night beast, Вы писали:
NB>так может и не нужно этого знать? NB>как часто может потребоваться писать такое самому?
Иногда приходится писать подобные низкоуровневые штуки.
Иногда подобный приём может пригодиться для другой задачи.
Наконец, оно пригодится, чтобы читать подобный легаси код.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Slawa Ms, Вы писали:
Pzz>>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен. SM>Т.е., имеем цикл на 100500 итераций. На третьей получаем нужный нам результат, но все равно будем продолжать 100497 раз?
Тогда это должно быть условием цикла. Что у нас цикл не "на 100500 итераций", а "100500 итераций либо получение результата".
Но с точки зрения кодирования, сделать это через break обычно легче, чем продумывать структуру цикла.
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
B>Тогда это должно быть условием цикла. Что у нас цикл не "на 100500 итераций", а "100500 итераций либо получение результата".
Такое пишется буквально на 2-й лекции по алгоритмам: последовательный поиск в неупорядоченном массиве
i = 0;
while(i < n && x != m[i]) ++i;
if(i < n) "нашли"; else"не нашли"
Ну, и потом всякие улучшения наступают...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Не, оне предлагают взводить флаг, который проверится на следующей итерации в for'е.
SVZ>Те же яйца, только в профиль. Зато по фэн-шую.
SVZ>Но ещё, вроде как, не считается ересью return для выхода из цикла.
Точно не перестаёт удивлять. Выход из цикла по условию продолжения- самое распространённое, но если ради этого вводить лишний флаг "isBreak", то imho из области "научи дурака богу молиться". Такое я бы попросил упростить в PR. KISS рулит.
Здравствуйте, night beast, Вы писали:
NB>открой для себя удивительный сайт gcc.godbolt.org и попроси его выполнить
Нафига мне ужасы C++. Вот Херб Саттер на CPPCon 2023 предлагает ввести новый синтаксис в C++, взять опыт из Typescript. В 10 раз понятнее и в 50 раз меньше стрелять в ногу.
Здравствуйте, Артём, Вы писали:
Аё>Нафига мне ужасы C++. Вот Херб Саттер на CPPCon 2023 предлагает ввести новый синтаксис в C++, взять опыт из Typescript. В 10 раз понятнее и в 50 раз меньше стрелять в ногу.
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, baxton_ulf, Вы писали:
_>>ну то есть ты согласен, что таких надо отсеивать?
C>Очевидно не этим способом, потому что он не работает. А то и наносит больше вреда чем пользы.
есть такое правило: критикуя предлагай.
у тебя же я пока вижу не подкрепленные ничем наезды — видимо из за обидок (не взяли). и никаких конструктивных предложений
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Почему все считают, что у программистов есть только одно хобби — программирование???
Программист, который никогда ничего не писал просто для себя — это как сантехник, у которого дома унитаз течет.
SVZ>Коли проходил не раз, то и проблем возникать не должно
Бред. У всех компаний тараканы разных пород.
SVZ>Что тут превозмогать??? Рассказываешь из своей практики, как и почему (не) применял ту или иную конструкцию. Получается очень содержательный разговор на профессиональную тему.
Чистый незамутненный инфантилизм. Я даже в самой зачуханной шарашкиной конторе такие вопросы не встречал.
выдыхай с тобой давно ясно все, просто поделился своим мнением. с точки зрения выразительности while/until всегда будет выигрывать прерванным циклам. понятно, что много от культуры программирования зависит но со временем любой код обрастает кораллами и то как это делет цикл с брейком намного выглядит паршивей вайла. тоже относится к continue, да полезная вещь в редких ситуациях, но она провоцирует людей писать трудноподдерживаемый код.
_>>совершенно верно в области забивания гвоздей и завинчивания шурупов все use-cases охвачены.
C>Причем множеством разных методов, а не одним универсальным, как этого хочешь ты.
я очень рад твоим познаниям в области заколачивания гвоздей разными способами.
но хотелось бы все таки услышать как нам нанимать программистов. пока от тебя не поступило ни одного рабочего предложения
_>>так что мимо. опять ляпнул не подумав.
C>Да. Ты. C>Всё, свободен.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>А ты можешь написать Фотошоп лучше, чем у Адоба? SVZ>В одиночку? Правда что-ли? SVZ>Я бы на это посмотрел!
Что, кроме аж целого фотошопа других вариантов нет? Обычное доведение до абсурда.
SVZ>Я даже не программист по диплому.
Тоже мне проблема. Я был знаком с одним менеджером из Амазона, так он и вовсе оперный певец. Вполне буквально.
Здравствуйте, CreatorCray, Вы писали:
CC>Неужто ты с зеркалом перестал разговаривать?
И не начинал. Что-нибудь поумнее детсадовского уровня придумать не можешь?
Не говоря уже о том, что твое стремление сказать гадость при любой возможности выглядит позорно.
Здравствуйте, Codealot, Вы писали:
Н>>Break что ли? C>Естественно. А чем еще это может быть?
Выход из функции по-исключению выброшенному из signal-handler'a!
Н>>Ну может он просто не понял тебя. C>Он смотрел на код и сказал "а что это за странная штука и зачем нужна?"
Я отчасти с ним согласен. break -- по-сути есть замаскированный goto, нарушающий принципы структурного программирвоания.
Здравствуйте, karbofos42, Вы писали:
K>Здравствуйте, fk0, Вы писали:
fk0>> Я отчасти с ним согласен. break -- по-сути есть замаскированный goto, нарушающий принципы структурного программирвоания.
K>А циклы сами по себе — это тоже по сути замаскированные goto/jmp. K>Как с ними не нарушать принципов структурного программирования?
В этой теме кто-то сказал, что структурное программирование -- это когда программа
строится из кубиков имеющих один вход и типично один (циклы), два (условный оператор)
или множество (switch) выходов. Мне такое определение понравилось. break/goto нарушают этот принцип.
Pzz>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен.
В "структурное программирование" вроде бы это единственный приличный случай использования goto
Здравствуйте, Pzz, Вы писали:
Pzz>Теорию знать не вредно.
Если ты не знаешь практику, никакие теории тебе не помогут.
C>>В любом случае, специалист должен знать реалии, а не только свои представления о правильности. Pzz>Хороший специалист обладает развитыми когнитивными картами. Это значит, что он знает или может придумать много правильных решений и сознательно выбирать из них наиболее подходящее, с оглядкой на конкретную ситуацию.
Это ты споришь с голосами в твоей голове, а не отвечаешь мне. Видишь, что я написал? Перечитай еще раз, если не понял.
Здравствуйте, Pzz, Вы писали:
Pzz>У меня не было учебника для начинающих. Приходилось как-то по-другому добывать информацию из окружающей среды.
В ВУЗе не учился, на лекции не ходил?
Ну если ты так умен чтобы сразу начинать книги с уровня профи, то остается только удивляться, почему ты еще не знаменит и не богат до омерзения.
Здравствуйте, Codealot, Вы писали:
C>Общался тут с одним чуваком по поводу ревью кода, и он не понимает, что такое цикл с выходом из середины. Вообще не знает, что это такое и зачем может быть нужно. C>Остается только гадать, как с такими знаниями можно пройти все эти зубодродительные алгоритмические собеседования. Ну и в свете этих идей о взаимозаменяемости всех, я вообще не хочу видеть код, который этот чувак может написать.
Здравствуйте, Stanislav V. Zudin, Вы писали:
NB>>так может и не нужно этого знать? SVZ>Иногда приходится писать подобные низкоуровневые штуки.
вот конкретно этот где может пригодиться?
лично мне нужен был пару раз когда по быстрому на коленке делалось что-то вроде atoi или валидации
я к тому что есть более нужные вещи, и не стоит по знанию/незнанию делать какие-то выводы
тот же прием Pzz с выбором функции на мой взгляд более полезен
Здравствуйте, night beast, Вы писали:
NB>вот конкретно этот где может пригодиться? NB>лично мне нужен был пару раз когда по быстрому на коленке делалось что-то вроде atoi или валидации
Такой трюк, только с 16-ричными числами, мне пришлось делать в 97 году на ассемблере. Из-за того, что сишный рантайм занимал целых 10кб. Всю программу на асме удалось уложить в 700байт. Была жесткая нехватка памяти и усилия того стоили.
NB>я к тому что есть более нужные вещи, и не стоит по знанию/незнанию делать какие-то выводы
Этот приём, по сути, просто получение элемента в таблице по смещению.
В книгах он хорошо разжеван. Его незнание, ессно, не проблема, но говорит много о человеке (изучает ли что-то сверх школьной программы).
Мы использовали такой подход для хранения компонентов печатных плат.
Отношение один-ко-многим. Объект ссылается на первый элемент "своей" коллекции.
Имея индекс текущего элемента и индекс первого элемента в группе вычисляется порядковый номер в коллекции.
Приём достаточно низкоуровневый, но должен же кто-то фреймворки не только использовать, но и разрабатывать
NB>тот же прием Pzz с выбором функции на мой взгляд более полезен
Да, приём неплохой.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Pzz, Вы писали:
Pzz>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен.
Почему?
Здравствуйте, Pzz, Вы писали:
NB>>тот же прием Pzz с выбором функции на мой взгляд более полезен Pzz>В молодости я так сделал пару раз. Сейчас бы не стал. Просто написал в качестве курьёза.
делал бы через указатель на функцию + иф или писал бы доп. функцию?
Здравствуйте, night beast, Вы писали:
Pzz>>В молодости я так сделал пару раз. Сейчас бы не стал. Просто написал в качестве курьёза.
NB>делал бы через указатель на функцию + иф или писал бы доп. функцию?
Здравствуйте, Vzhyk2, Вы писали:
V>Здравствуйте, Codealot, Вы писали:
Н>>>Break что ли? C>>Естественно. А чем еще это может быть? V>goto, return, исключение...
Еще есть exit.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Codealot, Вы писали:
C>>Общался тут с одним чуваком по поводу ревью кода, и он не понимает, что такое цикл с выходом из середины. Вообще не знает, что это такое и зачем может быть нужно.
Pzz>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен.
Т.е., имеем цикл на 100500 итераций. На третьей получаем нужный нам результат, но все равно будем продолжать 100497 раз?
Здравствуйте, Slawa Ms, Вы писали:
Pzz>>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен. SM>Т.е., имеем цикл на 100500 итераций. На третьей получаем нужный нам результат, но все равно будем продолжать 100497 раз?
Почему? Можно ж выйти по условию. Не обязательно делать goto из середины.
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, Slawa Ms, Вы писали:
Pzz>>>Ну при всем при том, методология разработки по имени "структурное программирование" считает, что выход из середины цикла не нужен. SM>>Т.е., имеем цикл на 100500 итераций. На третьей получаем нужный нам результат, но все равно будем продолжать 100497 раз?
Pzz>Почему? Можно ж выйти по условию. Не обязательно делать goto из середины.
У ТС речь шла про break, по нему и выходим по условию из середины цикла. Повторяю, ситуации, когда нужно выйти из середины цикла, встречаются часто. Зачем тратить время на полный перебор? Для этого используются break и exit. Про goto речь не идет. Даже не знаю, есть он в Delphi или нет.
Здравствуйте, Pzz, Вы писали:
NB>>>тот же прием Pzz с выбором функции на мой взгляд более полезен
SVZ>>Да, приём неплохой.
Pzz>Эта. Я не хотел подать пример. Скорее, наоборот.
А зря. Пример неплохой.
Легко читается, в отличие от какого-нибудь "двойного не" (!!variable)
Единственное сомнение — сможет ли компилятор в такой конструкции соптимиздить указатель на функцию.
_____________________
С уважением,
Stanislav V. Zudin
C>Ну если ты так умен чтобы сразу начинать книги с уровня профи, то остается только удивляться, почему ты еще не знаменит и не богат до омерзения.
А зачем?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Артём, Вы писали:
SVZ>>Но пример был из плюсов Аё>В плюсах можно переопределять операторы и можно макросами поменять true и false местами. Это точто был пример из каноничных плюсов с только stl?
открой для себя удивительный сайт gcc.godbolt.org и попроси его выполнить
Здравствуйте, baxton_ulf, Вы писали:
_>а разве тебе не помогает знание, например того, что с отсортированными коллекциями работать быстрее во многих задачах.
Это элементарщина, которую на собеседованиях уже давно не спрашивают.
_>пример из практики: лет, наверное 20 назад я видел программу намертво висящую потому, что обрабатывала коллекцию из 50К записей со сложностью O(N^2) если бы те программисты практиковали решение задач, которые "высосаны из пальца", то их алгоритм просто бы летал, а не висел по пол дня.
Я такое тоже видел. И даже хуже. Причем написанное людьми, которые каким-то образом прошли собеседование с кучей алгоритмических вопросов.
Здравствуйте, Артём, Вы писали:
Аё>Вот Херб Саттер на CPPCon 2023 предлагает ввести новый синтаксис в C++, взять опыт из Typescript. В 10 раз понятнее и в 50 раз меньше стрелять в ногу.
Плюсовики не примут. Илитарности было бы намного меньше.
Здравствуйте, Codealot, Вы писали:
LVV>>Такое пишется буквально на 2-й лекции по алгоритмам: последовательный поиск в неупорядоченном массиве
C>Ага, и копипаста условия. Отличный способ создать себе гемор на ровном месте.
У Лаптева, заметь, нет копипасты условия поиска. Только проверка границы.
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, baxton_ulf, Вы писали:
_>>а разве тебе не помогает знание, например того, что с отсортированными коллекциями работать быстрее во многих задачах.
C>Это элементарщина, которую на собеседованиях уже давно не спрашивают.
спрашивают, только не напрямую. практика показывает, что не такая уж и "элементарщина"
C>Я такое тоже видел. И даже хуже. Причем написанное людьми, которые каким-то образом прошли собеседование с кучей алгоритмических вопросов.
ну то есть ты согласен, что таких надо отсеивать?
сможешь рассказать как их отсеять на ближних подступах, до того как они напортачат в проекте?
Это ты обоснуй, что "это goto по сути", да еще и "в худшем его проявлении". Особенно вторую часть. А то мне интересно, как что-то может быть хуже, чем goto.
Здравствуйте, andyp, Вы писали:
A>Угу. Пол итерации в одной функции, пол итерации — в другой. Классная локальность выходит, все прям совсем рядом и по смыслу становится сразу понятно, что там происходит A>И это пришет чел, для которого break — когнитивная нагрузка.
Здравствуйте, andyp, Вы писали:
A>Если чувак там всех так ревьюит, то вся контора про break со временем забудет, и будет структурненько как в мертвецкой.
Ревьюит, в том числе. Тут все это делают по очереди. Даже если ничего не понимают
Вообще, не устаю удивляться странности здешних представлений о том, как надо работать правильно.
Здравствуйте, baxton_ulf, Вы писали:
_>есть такое правило: критикуя предлагай.
Да в общем то ничего сложного. Смотришь на код предыдущих проектов, к примеру. Обычно у профи есть хотя бы что-то в опен сорсе, или хобби-проекты.
_>у тебя же я пока вижу не подкрепленные ничем наезды — видимо из за обидок (не взяли). и никаких конструктивных предложений
Пф. Тупейший аргумент. Проходил такие собесы не раз, и обычно чем больше понтов на собесе, тем бестолковее компания.
А ты видимо очень гордишься, что ты превозмог и тебя взяли.
Здравствуйте, Codealot, Вы писали:
_>>есть такое правило: критикуя предлагай.
C>Да в общем то ничего сложного. Смотришь на код предыдущих проектов, к примеру. Обычно у профи есть хотя бы что-то в опен сорсе, или хобби-проекты.
ну, хотя бы так. да. а мидлов как набирать? а джунов?
да и думаю, если бы так набирали, то ты бы тут кричал про "что за тупейший способ" набирать
C>Пф. Тупейший аргумент. Проходил такие собесы не раз, и обычно чем больше понтов на собесе, тем бестолковее компания.
где вы такие находите то? и потом, как "понты" вообще связаны с решением какой-нибудь toy-problem? там же или решил или нет
C>А ты видимо очень гордишься, что ты превозмог и тебя взяли.
мне ещё не время хвастаться вот постарею совсем, тогда буду тут выкладывать
Здравствуйте, Codealot, Вы писали:
_>>ну то есть ты согласен, что таких надо отсеивать?
C>Очевидно не этим способом, потому что он не работает. А то и наносит больше вреда чем пользы.
Расскажи подробнее про вред. Друг просит
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Slawa Ms, Вы писали:
V>>goto, return, исключение... SM>Еще есть exit.
И abort()
Ещё с помощью signal можно самозавершиться, но это в специфических случаях.
M>Дядя Валера, а что буква учебника говорит про выход из цикла по break? Не увлеклись ли коллеги, очерняя этот способ?
Не учебник, а здравый смысл говорит, что и то, и другое в коде вполне приемлемо — зависит от задачи, как правило.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
M>>Дядя Валера, а что буква учебника говорит про выход из цикла по break? Не увлеклись ли коллеги, очерняя этот способ? LVV>Не учебник, а здравый смысл говорит, что и то, и другое в коде вполне приемлемо — зависит от задачи, как правило.
Со здравым смыслом я и не спорю.
Мне было любопытно, как этот аспект преподносится студентам.
LVV>>Написан псевдокод в стиле и. LVV>>А ты его воспринимаешь как реальный код ? NB>я его воспринял как рекомендацию изменять данные там, где изменение данных не предполагается. NB>в общем, вредный совет.
Ну, все претензии к Кнуту, которого я читал в начале 70-х, а писал он вообще в конце 60-х.
ИМХО зависит от задачи и потребностей с возможностями.
Вполне себе сокращаем количество операций на n проверок границы.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
M>>>Дядя Валера, а что буква учебника говорит про выход из цикла по break? Не увлеклись ли коллеги, очерняя этот способ? LVV>>Не учебник, а здравый смысл говорит, что и то, и другое в коде вполне приемлемо — зависит от задачи, как правило. M>Со здравым смыслом я и не спорю. M>Мне было любопытно, как этот аспект преподносится студентам.
Нормально преподносится, со здравым смыслом.
И то, и другое.
И объясняется, в чем разница.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
LVV>Ну, все претензии к Кнуту, которого я читал в начале 70-х, а писал он вообще в конце 60-х. LVV>ИМХО зависит от задачи и потребностей с возможностями.
да, метод рабочий (как и 0 в качестве терминатора строки), но сильно специфический.
LVV>>Ну, все претензии к Кнуту, которого я читал в начале 70-х, а писал он вообще в конце 60-х. LVV>>ИМХО зависит от задачи и потребностей с возможностями. NB>да, метод рабочий (как и 0 в качестве терминатора строки), но сильно специфический.
Напротив, классический.
Кнут жеж.
Его труд признан одним из 12 величайших трудов 20 века
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, LaptevVV, Вы писали:
NB>>да, метод рабочий (как и 0 в качестве терминатора строки), но сильно специфический. LVV>Напротив, классический. LVV>Кнут жеж
прям так и написано "делайте так когда нужно что-то найти"?
NB>прям так и написано "делайте так когда нужно что-то найти"?
Ну, открой же Кнута и почитай.
Он описывает разнообразные методы поиска
У меня тут есть пост про книжки по алгоритмам — там я про Кнута довольно подробно написал.
Новый список книг по алгоритмам — заголовок поста.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
очень спорное заявление. без выходов из цикла можно прекрасно обходиться. часто но не всегда — "выходы" проявление лени программиста, когда можно было не предавть избыточных вхдодных данных, но было лень считать. Всегда можно использовать while/until — это выглядит более уважительным к читателям кода, чем заставлять людей лазить по циклу и искать тот шедeвральный "Ups".
Здравствуйте, baxton_ulf, Вы писали:
_>он не масштабируется и не обобщается
Гвозди тоже не масштабируются и не обощаются. Когда-то надо использовать шурупы, когда-то болты, а когда-то и дюбели. Всё отменить, заменить одним универсальным решением!!!!!!1111
В общем чувак, со своими идеями о всеобщем обобщении ты просто невменяем.
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Расскажи подробнее про вред. Друг просит
Вред достаточно очевидный. Когда задают высосанные из пальца вопросы, на которые просто по ежедневной практике не ответишь — на них будут отвечать только зубрилы, которые готовились специально.
?G?>очень спорное заявление. без выходов из цикла можно прекрасно обходиться. часто но не всегда — "выходы" проявление лени программиста, когда можно было не предавть избыточных вхдодных данных, но было лень считать. Всегда можно использовать while/until — это выглядит более уважительным к читателям кода, чем заставлять людей лазить по циклу и искать тот шедeвральный "Ups".
Еще один. Что в фразе "можешь не использовать, но знать и понимать обязан" тебе не понятно?
Здравствуйте, Codealot, Вы писали:
SVZ>>Почему все считают, что у программистов есть только одно хобби — программирование???
C>Программист, который никогда ничего не писал просто для себя — это как сантехник, у которого дома унитаз течет.
Ну вот я не писал — не было нужды. Всё, что мне надо, уже написано.
Если уж говорить аллегориями, то предпочитаю унитаз промышленного изготовления, а не кустарного
SVZ>>Коли проходил не раз, то и проблем возникать не должно C>Бред. У всех компаний тараканы разных пород.
У Гугла с М$ покрупнее, у остальных помельче.
Но в целом у всех всё одинаково.
Ни разу не готовился к собеседованиям.
SVZ>>Что тут превозмогать??? Рассказываешь из своей практики, как и почему (не) применял ту или иную конструкцию. Получается очень содержательный разговор на профессиональную тему. C>Чистый незамутненный инфантилизм. Я даже в самой зачуханной шарашкиной конторе такие вопросы не встречал.
А не надо соваться в "зачуханные шарашкины конторы"
Лучшие компании, в которых я работал, именно так и собеседовали.
Получался увлекательнейший диспут на тему использования языковых конструкций, АПИ, технологий, алгоритмов.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, Codealot, Вы писали:
SVZ>>Расскажи подробнее про вред. Друг просит
C>Вред достаточно очевидный. Когда задают высосанные из пальца вопросы, на которые просто по ежедневной практике не ответишь — на них будут отвечать только зубрилы, которые готовились специально.
...либо те, кто с этим сталкивался в реальной работе.
_____________________
С уважением,
Stanislav V. Zudin
C>Опаньки, а откуда у тебя во входном массиве лишнее место? Решение становится всё замудренее, и без каких-либо причин, кроме сектантских идей.
Да ты сам сектант. Новых идей не воспринимаешь.
И считаешь свое мнение единственно правильным.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, baxton_ulf, Вы писали:
_>>он не масштабируется и не обобщается
C>Гвозди тоже не масштабируются и не обощаются. Когда-то надо использовать шурупы, когда-то болты, а когда-то и дюбели. Всё отменить, заменить одним универсальным решением!!!!!!1111
совершенно верно в области забивания гвоздей и завинчивания шурупов все use-cases охвачены. так что мимо. опять ляпнул не подумав.
кстати, а зачем ты на гвозди перешёл? какие-то болезненные воспоминания? мы же вроде о проведении интервью в IT
C>В общем чувак, со своими идеями о всеобщем обобщении ты просто невменяем.
SM>>Еще есть exit.
N>Application.Exit в винформс? или ты про паскаль?
Я про Дельфи, ТС не написал, какой язык имеется в виду.
Выход из функции: Delphi — exit, Python — return.
Других языков не знаю
?G?>с точки зрения выразительности while/until всегда будет выигрывать прерванным циклам. понятно, что много от культуры программирования зависит но со временем любой код обрастает кораллами и то как это делет цикл с брейком намного выглядит паршивей вайла. тоже относится к continue, да полезная вещь в редких ситуациях, но она провоцирует людей писать трудноподдерживаемый код.
Я тебе про Фому, а ты мне про Ерему.
В любом случае, ничего нового ты не сказал. Я все это уже не один десяток раз слышал.
Здравствуйте, Codealot, Вы писали:
SVZ>>Ну вот я не писал — не было нужды. Всё, что мне надо, уже написано.
C>Это говорит только о том, что ты не можешь лучше.
А ты можешь написать Фотошоп лучше, чем у Адоба?
В одиночку? Правда что-ли?
Я бы на это посмотрел!
SVZ>>А не надо соваться в "зачуханные шарашкины конторы"
C>Уже давно не, но в стародавние времена приходилось. Не всем всё достается на тарелочке.
Это намёк в мой адрес?
Так я тут тебе вааще не конкурент. Я даже не программист по диплому.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, smeeld, Вы писали:
Pzz>>Сейчас неожиданно окажется, что полфорума не понимают эту запись, но стесняются сказать.
S>Эх вы, сишные динозавры. Это вы не понимаете, в модных молодежных язычках такое знать не требуется
Я хорошо знаю Go. Некоторые особенности Go совершенно очевидны сишным динозаврам, но как их понимают люди из Питона, ума ни приложу.
Здравствуйте, Codealot, Вы писали:
C>Это точно не базовые конструкции языка, так что не надо мутить воду.
Да ладно, это обсасывается почти везде, даже во многих учебниках.
Здравствуйте, Dym On, Вы писали:
C>>Это точно не базовые конструкции языка, так что не надо мутить воду. DO>Да ладно, это обсасывается почти везде, даже во многих учебниках. DO>Есть фишки покруче, например, метод Даффа
Pzz>>Сейчас неожиданно окажется, что полфорума не понимают эту запись, но стесняются сказать.
S>Эх вы, сишные динозавры. Это вы не понимаете, в модных молодежных язычках такое знать не требуется
Мне вот потребовалось недавно. Ибо в модном молодежном .Net int.Parse работает в 1000 раз медленнее чем приведенный код.
Здравствуйте, Codealot, Вы писали:
SVZ>>А ты можешь написать Фотошоп лучше, чем у Адоба? SVZ>>В одиночку? Правда что-ли? SVZ>>Я бы на это посмотрел!
C>Что, кроме аж целого фотошопа других вариантов нет? Обычное доведение до абсурда.
Почему ты везде ищешь подвох?
Занимался фотографией, нужны были фотошоп и лайтрум.
Всё остальное доступно забесплатно или за маленькую денежку.
Приведи свой пример, что тебе потребовалось написать руками для себя для любимого.
Мне реально любопытно, что люди мастерят дома для себя. Чего такого можно выложить в качестве петпроекта.
C>Тоже мне проблема. Я был знаком с одним менеджером из Амазона, так он и вовсе оперный певец. Вполне буквально.
Мой научный руководитель по совместительству был регентом церковного хора.
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, night beast, Вы писали:
SVZ>>Мой научный руководитель по совместительству был регентом церковного хора.
NB>эм... а регент разве не про управление гос-ом?
Про управление — да, про гос-во — не обязательно
_____________________
С уважением,
Stanislav V. Zudin
Здравствуйте, night beast, Вы писали:
NB>>>эм... а регент разве не про управление гос-ом? SVZ>>Про управление — да, про гос-во — не обязательно
NB>вроде бы, если не про государство, то говорят ИО
Здравствуйте, Stanislav V. Zudin, Вы писали:
NB>>вроде бы, если не про государство, то говорят ИО
SVZ>ИО = "исполняющий обязанности". SVZ>Регент = руководитель.
я кажется понял. это из церковного
Ре́гент – (от лат. regens «правящий, правитель») — руководитель церковного хора.
...
В наше время регент управляет церковным хором, он же готовит певчих и подбирает необходимые книги для богослужения – проводит репетиции хора и отвечает за его организацию, составляет структуру исполняемых молитвословий на богослужении, приобретает и отвечает за сохранность соответствующих богослужебных книг и нот.
Здравствуйте, Философ, Вы писали:
Ф>break, return, goto, throw знаю, а вот "цикл с выходом из середины" — какая-то непонятная хрень. Никогда не слышал. Ф>Какой-то новый термин.
continue еще можно под это притянуть
Здравствуйте, Codealot, Вы писали:
C>То что ты о чем-то не слышал говорит только о твоем уровне знаний.
Я погуглил — действительно в учебниках встречается. Однако я когда-то тоже циклы учил, и в моих учебниках такого не было. Вероятно, авторы посчитали это лишним искуственным терменом и просто выкинули его. И я более чем 20 лет ни разу не слышал, чтобы кто-то так говорил — понятия цикла достаточно и для объяснения чего-либо и для написания всего чего угодно.
Запоминать и держать в голове лишние сущности не вижу смысла.
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Osaka, Вы писали:
SVZ>>и почему придуманная им инициализация char* c = {1,2,3} не работает O>Минут 5 думал, что в данном контексте означает "работает".
Классика же!
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Codealot, Вы писали:
C>Это элементарщина, которую на собеседованиях уже давно не спрашивают.
И похоже зря — студни позабыли что простые вещи могут быть быстрыми
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Codealot, Вы писали:
C>С неадекватами и лжецами не спорю.
Неужто ты с зеркалом перестал разговаривать?
C> До тебя медленно доходит?
А нет, не перестал...
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Stanislav V. Zudin, Вы писали:
SVZ>Ну вот я не писал — не было нужды. Всё, что мне надо, уже написано.
Хорошо тебе...
SVZ>Если уж говорить аллегориями, то предпочитаю унитаз промышленного изготовления, а не кустарного
Не ну если ты только кустарный код можешь производить то тогда да...
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Codealot, Вы писали:
C>Это точно не базовые конструкции языка CC>>Это как раз самые что ни на есть базовые. C>Расскажи мне, в чем смысл писать индексацию как
Т.е. ты признаёшь что это базовое свойство языка?
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, CreatorCray, Вы писали:
CC>Т.е. ты признаёшь что это базовое свойство языка?
Извращения к числу базовых конструкций не относятся. Знать их новичкам точно не надо. А за использование надо бить палкой, чтобы лучше доходило.
Ну так на вопрос ты ответить в состоянии?
Здравствуйте, Codealot, Вы писали:
C>Извращения к числу базовых конструкций не относятся.
Что значит извращения?
Это легальное свойство языка. Особенно тернарный оператор.
C>Ну так на вопрос ты ответить в состоянии?
Перевод темы вопросом не считается.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, oncer, Вы писали:
O>"цикл с выходом из середины" — лексика странная. Чел вполне мог не понять. Особенно, если чел читает книги на Инглише, а тут .... "цикл с выходом из середины" — я тож такую формулировку впервые слышу... O>Может "прерывание цикла" было бы понятнее?
Как я уже сказал, чувак просто смотрел на код. Не надо высасывать из пальца.
сто лет на квыт не заходил
но меня порадовало когда увидел что тут всё те же люди всё так же из малюсенькой фразы раздувают километровое обсуждение)
как будто был тут вчера
Здравствуйте, cthsq, Вы писали:
C>сто лет на квыт не заходил C>но меня порадовало когда увидел что тут всё те же люди всё так же из малюсенькой фразы раздувают километровое обсуждение)
Я было пропустил недельку и насрали столько что только недавно разгрёб
И то пришлось на все темы авторства Shmj сразу пометки "прочитано" и "не показывать больше" поставить
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Codealot, Вы писали:
C>Здравствуйте, Pzz, Вы писали:
Pzz>>Нет.
C>Вероятно, там предложат сделать добавочный флаг для выхода и вытащить часть переменных из цикла. Но люди без склонности к сектанству так не делают.
Здравствуйте, Codealot, Вы писали:
C>Общался тут с одним чуваком по поводу ревью кода, и он не понимает, что такое цикл с выходом из середины. Вообще не знает, что это такое и зачем может быть нужно.
Тоже поплачусь.
Работая в одной безусловно крупной софтовой фирме очень сильно удивил на код-ревью оператором do-while
без фигурных скобок. Условно: "do *x != y; while(++x);".
А уж объяснить, что в языках C/C++ есть понятие временного значения (например, возвращаемого из функции)
у которого есть в свою очередь понятие срока жизни -- вообще трудно. Не говоря уж о том, что на это
временное значение могут существовать ссылки/указатели, у которых тоже срок жизни...
Здравствуйте, fk0, Вы писали:
fk0> Я отчасти с ним согласен. break -- по-сути есть замаскированный goto, нарушающий принципы структурного программирвоания.
На самом деле нет. Но фанатикам нюансы не интересны.
Здравствуйте, karbofos42, Вы писали:
K>Здравствуйте, fk0, Вы писали:
fk0>> Я отчасти с ним согласен. break -- по-сути есть замаскированный goto, нарушающий принципы структурного программирвоания.
K>А циклы сами по себе — это тоже по сути замаскированные goto/jmp. K>Как с ними не нарушать принципов структурного программирования?
Нет. Есть принципиальная разница между циклом с goto и циклом с использованием операторов структурного программирования:
при использовании последних все объекты создаваемые в цикле, в каждом цикле вначале заново инициализируются, а в конце
цикла неявным образом уничтожаются. И вообще могут иметь разные адреса в каждом цикле. А с goto получается чёрти что.
Здравствуйте, fk0, Вы писали:
fk0> Нет. Есть принципиальная разница между циклом с goto и циклом с использованием операторов структурного программирования: fk0>при использовании последних все объекты создаваемые в цикле, в каждом цикле вначале заново инициализируются, а в конце fk0>цикла неявным образом уничтожаются. И вообще могут иметь разные адреса в каждом цикле. А с goto получается чёрти что.
цикл на нижнем уровне — это просто условный переход jmp или как там уж это называется.
бесконечный цикл может быть представлен как безусловный переход goto.
И выполнение функции — это тоже переход на нужный адрес в памяти.
Всё это управление стеком, инициализацию переменных, очистку памяти,... добавляет компилятор.
Никто не мешает этому самому компилятору нормально обрабатывать и goto и уведомлять о существующих проблемах.
Собственно, в C# goto из цикла превращается в break.
А без дублирования return или break, как в структурном программировании предлагается сделать банальный поиск элемента в массиве?
int FindIndex(int[] arr, int value)
{
for (int i = 0; i < arr.Length; ++i)
{
if (arr[i] == value)
return i;
}
return -1;
}
даже если первый элемент подойдёт, продолжим пробегать всю коллекцию, чтобы было структурно и молодёжно?
int FindIndex(int[] arr, int value)
{
int result = -1;
for (int i = 0; i < arr.Length; ++i)
{
if (result == -1 && arr[i] == value)
result = i;
}
return result;
}
А то ведь return внутри цикла может привести к тому, что разработчик что-то забудет удалить или сделать, должна быть одна точка выхода из функции.
Я сам как-то goto не использую и редко такое нужно, но вот думаю: а зачем я для выхода из вложенных циклов горожу флаги и леплю лишние проверки, когда можно просто goto написать и перейти в нужную точку.
Здравствуйте, karbofos42, Вы писали:
K>Здравствуйте, fk0, Вы писали:
fk0>> Нет. Есть принципиальная разница между циклом с goto и циклом с использованием операторов структурного программирования: fk0>>при использовании последних все объекты создаваемые в цикле, в каждом цикле вначале заново инициализируются, а в конце fk0>>цикла неявным образом уничтожаются. И вообще могут иметь разные адреса в каждом цикле. А с goto получается чёрти что.
K>цикл на нижнем уровне — это просто условный переход jmp или как там уж это называется. K>бесконечный цикл может быть представлен как безусловный переход goto.
НЕТ, ещё раз: цикл в распространённых языках C/C++ уничтожает и создаёт заново все объекты
созданные в теле цикла. Это ПРИНЦИПИАЛЬНОЕ свойство цикла. Для C++ программистов оно означает,
что "for (auto& x : MakeTempObject())" не будет работать (вроде как будет пофикшено в C++23 для
этого частного случая), для C-программистов означает, что переменные объявленные в теле цикла
не обязаны сохранять свои значения (и адреса) в каждой новой итерации. Последнее легко заметно
в каком-нибудь интерпретаторе C, вроде Ch.
K>И выполнение функции — это тоже переход на нужный адрес в памяти.
Я знаю ассемблер. Но цикл и вызов функции -- это не только переход.
Переход лишь как средство реализации. И оно может оказаться совершенно другим.
Цикл может быть развёрнут, может быть tail call оптимизация, функция может быть
заинлайнена, да что угодно ещё...
K>Всё это управление стеком, инициализацию переменных, очистку памяти,... добавляет компилятор. K>Никто не мешает этому самому компилятору нормально обрабатывать и goto и уведомлять о существующих проблемах. K>Собственно, в C# goto из цикла превращается в break.
Но никто не мешает порождать код с UB и молча молчать. И получать неинициализированные
переменные например. При прыжке вперёд через инициализацию переменной (C++ запрещает)
или прыжке назад в середину тела цикла в котором декларировались переменные.
K>А без дублирования return или break, как в структурном программировании предлагается сделать банальный поиск элемента в массиве?
Любой код может быть написан через рекурсию...
K>
K>int FindIndex(int[] arr, int value)
K>{
K> for (int i = 0; i < arr.Length; ++i)
K> {
K> if (arr[i] == value)
K> return i;
K> }
K> return -1;
K>}
K>
K>даже если первый элемент подойдёт, продолжим пробегать всю коллекцию, чтобы было структурно и молодёжно?
Нет. Условие прерывания цикла может переехать в оператор for, например.
K>
K>int FindIndex(int[] arr, int value)
K>{
K> int result = -1;
K> for (int i = 0; i < arr.Length; ++i)
K> {
K> if (result == -1 && arr[i] == value)
K> result = i;
K> }
K> return result;
K>}
K>
K>А то ведь return внутри цикла может привести к тому, что разработчик что-то забудет удалить или сделать, должна быть одна точка выхода из функции.
Вообще-то да. В голом C или паскале. В языках с RAII это не так критично.
K>Я сам как-то goto не использую и редко такое нужно, но вот думаю: а зачем я для выхода из вложенных циклов горожу флаги и леплю лишние проверки, когда можно просто goto написать и перейти в нужную точку.
И сразу вопрос, что делать компилятору с переменными созданными в цикле?
Деструктор для них же надо вызывать? И становится goto очень неочевидным оператором,
с очень неявным control flow...
Здравствуйте, fk0, Вы писали:
fk0> НЕТ, ещё раз: цикл в распространённых языках C/C++ уничтожает и создаёт заново все объекты созданные в теле цикла.
В С всё на ручнике
Потом, тело цикла это то, что под for а не внутри.
fk0>Для C++ программистов оно означает, что "for (auto& x : MakeTempObject())" не будет работать
Это как раз работает даже в C++11, где range-for только появился.
Ибо range for это синтаксический сахар, который разворачивается в как минимум вот такое:
{
auto&& __range = range-expression; <<< результат moves в __range который спокойно себе живёт вне for-loop, и переживает его
for (auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin)
{
range-declaration = *__begin;
loop-statement
}
}
Потом ещё больше вынесли наружу, но это не суть.
Проблемы будут с "for (auto& x : MakeTempObject().getObjects())"
Но совсем не потому что for.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, fk0, Вы писали:
fk0> НЕТ, ещё раз: цикл в распространённых языках C/C++ уничтожает и создаёт заново все объекты fk0>созданные в теле цикла. Это ПРИНЦИПИАЛЬНОЕ свойство цикла. Для C++ программистов оно означает, fk0>что "for (auto& x : MakeTempObject())" не будет работать (вроде как будет пофикшено в C++23 для fk0>этого частного случая), для C-программистов означает, что переменные объявленные в теле цикла fk0>не обязаны сохранять свои значения (и адреса) в каждой новой итерации.
Ну, вот код на C++:
for (int i = 0; i < 10; ++i)
{
A *arr = new A();
}
цикл каждую итерацию будет удалять созданный объект класса A или всё же память утечёт и нет никакой гарантии про все объекты?
fk0> Я знаю ассемблер. Но цикл и вызов функции -- это не только переход. fk0>Переход лишь как средство реализации. И оно может оказаться совершенно другим. fk0>Цикл может быть развёрнут, может быть tail call оптимизация, функция может быть fk0>заинлайнена, да что угодно ещё...
Но технически все эти функции и циклы преобразуются в банальные goto или что-то подобное, а вся эта инициализация переменных, очистка стека — это добавляет компилятор.
fk0> Но никто не мешает порождать код с UB и молча молчать. И получать неинициализированные fk0>переменные например. При прыжке вперёд через инициализацию переменной (C++ запрещает) fk0>или прыжке назад в середину тела цикла в котором декларировались переменные.
Вопрос к создателям языка и компиляторов к нему. Никто им не мешает обойтись без UB
fk0> Нет. Условие прерывания цикла может переехать в оператор for, например.
В простейшем случае в итоге получим некрасивую запись и лишнюю проверку в конце, где будем выяснять причины попадания в строку
(коллекция кончилась и ничего нужного не нашлось или же наткнулись на искомый элемент и нужно его вернуть).
На деле же условие выхода из цикла будет с предварительными расчётами и в for не влезет.
Можно конечно всякого нагородить, но не понятно зачем.
Там же и читабельность кода снизится и лишние операции добавятся.
fk0> И сразу вопрос, что делать компилятору с переменными созданными в цикле? fk0>Деструктор для них же надо вызывать?
примерно то же самое, что компилятор делает при break
fk0>И становится goto очень неочевидным оператором, fk0>с очень неявным control flow...
у исключений с try/catch не проще и потенциальных проблем от них не меньше, но народ как-то живёт.
Ну, сложно с goto — пусть дадут оператор для выхода из всех циклов.
Бывают ситуации типа:
int value = 0; // стандартное значениеfor (int i = 0; i < 10; ++i)
{
for (int j = i + 1; j < 11; ++j)
{
for (int k = j + 1; k < 12; ++k)
{
if (...)
value = ...; // меняем значение на расчётноеbreak; // тут хочется выйти из всех 3-х циклов
}
}
}
// Дальше используем value вне зависимости от того какое значение (стандартное или расчётное)
break из одного цикла почему-то не является проблемой для создателей языков.
Как и return из любой строки.
Не понимаю что не так с break из пары вложенных циклов и чем это принципиально отличается.
Можно конечно всё это в единственный while переписать или ещё чего намудрить, но читаемость кода снизится,
а по факту будет выполняться примерно то же самое, что можно с goto написать и не терять в читаемости.
И в итоге на практике не понятно что выйдет надёжнее в поддержке:
странно написанный и непонятный код по всем правилам структурного программирования или лаконичный код с сомнительным goto.
Здравствуйте, CreatorCray, Вы писали:
CC>Здравствуйте, fk0, Вы писали:
fk0>> НЕТ, ещё раз: цикл в распространённых языках C/C++ уничтожает и создаёт заново все объекты созданные в теле цикла. CC>В С всё на ручнике CC>Потом, тело цикла это то, что под for а не внутри.
Всё да не всё. Формально "рантайм" освобождает память из под переменных скоупе тела цикла
и формально может назначить на следующей итерации другие адреса. Повторюсь, в каком-нибудь Ch
можно запросто напороться на то, что не работает, но строго соответствует букве стандарта.
Или второй операнд оператора for (где может быть декларация переменной) будет вычисляться каждый
раз в начале цикла и уничтожаться в конце цикла. Это же не просто так.
fk0>>Для C++ программистов оно означает, что "for (auto& x : MakeTempObject())" не будет работать CC>Это как раз работает даже в C++11, где range-for только появился.
Да, я не прав. Не рабоатет MakeTempObject().getter(), но это другое.
Здравствуйте, karbofos42, Вы писали:
K>Здравствуйте, fk0, Вы писали:
fk0>> НЕТ, ещё раз: цикл в распространённых языках C/C++ уничтожает и создаёт заново все объекты fk0>>созданные в теле цикла. Это ПРИНЦИПИАЛЬНОЕ свойство цикла. Для C++ программистов оно означает, fk0>>что "for (auto& x : MakeTempObject())" не будет работать (вроде как будет пофикшено в C++23 для fk0>>этого частного случая), для C-программистов означает, что переменные объявленные в теле цикла fk0>>не обязаны сохранять свои значения (и адреса) в каждой новой итерации.
K>Ну, вот код на C++: K>
K>for (int i = 0; i < 10; ++i)
K>{
K> A *arr = new A();
K>}
K>
K>цикл каждую итерацию будет удалять созданный объект класса A или всё же память утечёт и нет никакой гарантии про все объекты?
Причём здесь new? Если A() будет без new (на стеке) и написать деструктор, то будет видно, что он вызывается...
А по-указателю C++-компилятор сам ничего удалять не будет. Вот переменную указателя он "удалит". Но у ней деструктор
пустой.
K>у исключений с try/catch не проще и потенциальных проблем от них не меньше, но народ как-то живёт. K>Ну, сложно с goto — пусть дадут оператор для выхода из всех циклов. K>Бывают ситуации типа:
K>
K>int value = 0; // стандартное значение
K>for (int i = 0; i < 10; ++i)
K>{
K> for (int j = i + 1; j < 11; ++j)
K> {
K> for (int k = j + 1; k < 12; ++k)
K> {
K> if (...)
K> value = ...; // меняем значение на расчётное
K> break; // тут хочется выйти из всех 3-х циклов
K> }
K> }
K>}
K>// Дальше используем value вне зависимости от того какое значение (стандартное или расчётное)
K>
Оператора выхода из всех циклов потому и нет, что он порождает ошибки и непонятно
как его сделать. Вместо него может выступать goto, может выступать return, могут выступать
более сложные условия. В некоторых языках... (bash) такой оператор есть, но лучше б не было...
В некоторых других (tcl) нет и невозможен goto, и break делается... через исключение!
K>Не понимаю что не так с break из пары вложенных циклов и чем это принципиально отличается.
Из скольки именно циклов? А если циферку числа циклов впишут, а потом код поменяют?
K>Можно конечно всё это в единственный while переписать или ещё чего намудрить, но читаемость кода снизится, K>а по факту будет выполняться примерно то же самое, что можно с goto написать и не терять в читаемости.
Вот полезные применения goto как раз:
1) обработка ошибок, вместо отсутствующего оператора defer: https://gustedt.gitlabpages.inria.fr/defer/
2) прерывание нескольких вложенных циклов;
3) возможно ещё какие-то экзотические случаи, которые сходу не припомнить.
Но ведь заставь дурака богу молиться -- лоб расшибёт.
K>И в итоге на практике не понятно что выйдет надёжнее в поддержке: K>странно написанный и непонятный код по всем правилам структурного программирования или лаконичный код с сомнительным goto.