|
1 / 1 / 0
Регистрация: 21.09.2025
Сообщений: 32
|
|
Оператор goto. Ищу примеры эффективного использования21.10.2025, 09:22. Показов 2510. Ответов 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? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Установка нескольких штампов электронной подписи в строго определенных местах файла docx
ВладимирСамохин 19.07.2026
(В!) Работа с Электронной подписью - это неотъемлемая часть современного документооборота. Но что делать, если нужно поставить несколько штампов электронной подписи в строго определенных местах. . .
|
сукцессия 35. Научная статья о проделанной работе
anaschu 19.07.2026
Написал в формате латекс и пдф
|
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения.
https:/ / habr. com/ ru/ sandbox/ 295048/
начало и оглавление
-
Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
|
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
|
|
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
|
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано
Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
|
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0)
Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона
Уважаемые коллеги!
В продолжение. . .
|
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии
Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
|