|
1 / 1 / 0
Регистрация: 21.09.2025
Сообщений: 32
|
|
Оператор goto. Ищу примеры эффективного использования21.10.2025, 09:22. Показов 2476. Ответов 49
Метки нет (Все метки)
Приветствую,
Тема сложная, но может оказаться интересной для опытных программистов. Оператор goto хоть и гибкий, но отходит от принципов структурного программирования. Я исследую эту тему, и ищу примеры, где использование goto оправдано в плане компактности, эффективности, читабельности кода. Например, goto помогает: * выйти из многоуровневого цикла (где break не справится) * избавиться от структур вложенных if-блоков * ... какие еще примеры? Добавлено через 16 секунд Язык - любой, например Си.
0
|
|
| 21.10.2025, 09:22 | |
|
Ответы с готовыми решениями:
49
Понятие трудоёмкости алгоритма. Понятие эффективного алгоритма
каким образом на схеме изобразить процедуру goto |
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|||
| 27.10.2025, 12:59 | |||
|
А если всё получилось, кто будет вызывать деструкторы? Зачем выполнять "destructor2(&___);", если мы не добрались до строки "if(!(___ = _3rdfn(…)) goto ooops;"?
0
|
|||
|
Windows must die
|
|||||||||
| 27.10.2025, 14:51 | |||||||||
|
Добавлено через 3 минуты
0
|
|||||||||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
||||||||
| 27.10.2025, 16:08 | ||||||||
|
Добавлено через 1 минуту
0
|
||||||||
|
Windows must die
|
|||||||||||||||||
| 27.10.2025, 17:06 | |||||||||||||||||
|
Shamil1, я имею в виду:
Добавлено через 2 минуты
0
|
|||||||||||||||||
|
Модератор
|
||
| 27.10.2025, 21:17 | ||
|
Я этого языка не знаю но понимаю что там написано.
1
|
||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|||||||||||||
| 28.10.2025, 09:47 | |||||||||||||
Если не хочется одинаковый код писать несколько раз, то можно выделить 4 строки
Конечно, можно специально для этого объявить структуру из трёх чисел. Но лучше использовать кортеж (int, int, int). Как нам быть, если возвращать число (или несколько) нужно не всегда? Конечно, можно использовать специальное значение (например, -1). Но лучше явно указать, что мы возвращаем ничего: int? вместо int или (int, int, int)? вместо (int, int, int). int[,,] - трёхмерный массив Predicate<int> - предикат. то есть, функция, которая принимает int и возвращает bool. По сути - это Си плюс немного синтаксического сахара.
0
|
|||||||||||||
|
Windows must die
|
||||
| 28.10.2025, 10:04 | ||||
|
0
|
||||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
||||
| 28.10.2025, 11:29 | ||||
|
0
|
||||
|
332 / 126 / 8
Регистрация: 19.07.2024
Сообщений: 664
|
||
| 28.10.2025, 11:55 | ||
|
* общие точки выхода из большой и развесистой функции (например: точка err: и точка success: в которые имеется множество переходов в пределах функции).
0
|
||
|
Модератор
|
||||
| 28.10.2025, 12:31 | ||||
|
0
|
||||
|
332 / 126 / 8
Регистрация: 19.07.2024
Сообщений: 664
|
||||
| 28.10.2025, 13:14 | ||||
![]() Если использование goto улучшает читаемость и оптимизирует код, то его использование оправдано, а остальные решения - "именно ошибка проектирования". ![]() Если "разделение на функции" ухудшает читаемость и ухудшает оптимальность кода (если она важна), то как раз эта разбивка и будет "ошибка организации кода", а не goto. Добавлено через 4 минуты
1
|
||||
|
Windows must die
|
|
| 28.10.2025, 13:16 | |
|
"Ошибка проектирования" - это бояться goto и не использовать даже там, где без него вообще никак невозможно обойтись!
Вот с longjump нужно аккуратно обращаться, если "прыжки" между функциями выполняются. А goto может сэкономить ресурсы, особенно на микроконтроллерах. Любой вход в функцию связан с уймой накладных расходов. Вот, скажем, чтобы не увеличиать эти расходы в тех случаях, когда мне нужно несколько раз один и тот же блок использовать, а в виде макроса это будет некрасиво или сложно, просто использую вложенные функции. К сожалению, шланг не понимает вложенных функций, поэтому из двух компиляторов остается лишь gcc. Пробовал как-то в обработке изображений избавиться от таких вложенных функций: производительность процентов на пять упала!
0
|
|
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
||
| 28.10.2025, 14:17 | ||
|
0
|
||
|
Windows must die
|
|
| 28.10.2025, 14:50 | |
|
Shamil1, ничего "грязного" в использовании goto нет!
Все равно "на нижнем уровне" ваши "красивости" превратятся в итоге в те же goto… Скажем, если switch оптимизируется (например, весь набор вариантов - из enum), то просто будет вычислен индекс "смещение + значение из case", а после — goto на адрес, хранящийся в этой ячейке. Но руками так делать не очень удобно. Хотя, для оптимизации чего только не сделаешь. Как пример: медленный МК, а в switch мы проверяем хэш текстовой команды (а команд у нас, скажем, несколько сотен). Чтобы не ветвиться в длительных if (во что это и будет развернуто компилятором в данном случае), есть смысл организовать свой поиск - дихотомией, например. А уж по найденному индексу и будем вызывать функцию-обработчик. Например, в сравнительно медленной флеш-памяти я именно бисекцией ищу последний записанный кусок конфигурационных данных: выровненная структура имеет известный размер, в "голове" ее записан "magick" uint_16_t (часто - этот самый размер), и т.к. это число - гарантированно не 0xffff, то можно смело читать соответствующие четыре байта из области флеш "эмулятора EEPROM", прыгая туда-сюда. В итоге в худшем случае при линейном поиске мы потратим пару-тройку секунд на отыскание последней записи, а бинарным поиском - буквально несколько миллисекунд! Не по теме:
0
|
|
|
332 / 126 / 8
Регистрация: 19.07.2024
Сообщений: 664
|
|||||||
| 28.10.2025, 17:17 | |||||||
Можно конечно насоздавать тут кучу дополнительных функций. Для каждой ветки. Но код станет гораздо менее читаемым. Если скажем после каждой case Nx идёт 2-3 строки кода, то здесь (с goto) всё на одном экране и легко читаемо. "Грязный трюк" тут будет - налепить кучу ненужных функций.
0
|
|||||||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
|||
| 29.10.2025, 09:45 | |||
|
Добавлено через 3 минуты
0
|
|||
|
332 / 126 / 8
Регистрация: 19.07.2024
Сообщений: 664
|
|
| 29.10.2025, 12:08 | |
|
0
|
|
|
Windows must die
|
||||||
| 29.10.2025, 12:29 | ||||||
|
Видимо, имеется в виду вместо goto вызвать вложенную функцию, как здесь:
А если функцию commonN1N2N3 еще и вынести за пределы processstate, так вообще полная фигня получится, если она пользовалась какими-то внутренними переменными последней. Зачем регистры туда-сюда гонять, еще и стек "спасать", если достаточно простого goto?
0
|
||||||
|
Модератор
3140 / 2288 / 469
Регистрация: 26.03.2015
Сообщений: 8,898
|
||||
| 29.10.2025, 15:29 | ||||
|
Добавлено через 6 минут
0
|
||||
|
Windows must die
|
|||
| 29.10.2025, 17:42 | |||
|
Нужно стараться экономить ресурсы: на единицах байтов и наносекундах вполне могут вырасти мегабайты и миллисекунды, что уже плохо. Не по теме:
0
|
|||
| 29.10.2025, 17:42 | |
|
Случаи удачного применения оператора goto Правда ли, что "Goto: за и против" от Дейкстры - явная и сознательная монополизация рынка? посоветоваться о эффективном алгоритме резервирования данных Вопрос об эффективности приминения языков программирования. Как эффективно обрабатывать значение Null? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот.
Ларри Уингет
|
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
|
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров
В текущей версии модели успешно реализован ключевой механизм. . .
|
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям
Реализованные компоненты:
Механизм закисления почвы через протонную помпу
Конкуренция между типами микориз
pH как триггер сукцессии
C/ P соотношение. . .
|
|
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
|
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
|
сукцессия 25. Хронология ошибок
anaschu 12.07.2026
# От 50-тонного гриба до устойчивого леса: хроника ошибок при построении модели вековой сукцессии микоризы
## О чём эта статья
В процессе построения ОДУ-модели (система дифференциальных. . .
|
сукцессия 24. Промежуточное общее описание модели
anaschu 12.07.2026
Хендофф: модель АМ→ЭКМ сукцессии микоризы (ризосфера, 50 лет)
Содержание проекта
Симуляция вековой (50 лет) экологической сукцессии в почве леса
Основные участники: АМ-гриб, ЭКМ-гриб,. . .
|