|
1 / 1 / 0
Регистрация: 21.09.2025
Сообщений: 24
|
|
Оператор goto. Ищу примеры эффективного использования21.10.2025, 09:22. Показов 2002. Ответов 49
Метки нет (Все метки)
Приветствую,
Тема сложная, но может оказаться интересной для опытных программистов. Оператор goto хоть и гибкий, но отходит от принципов структурного программирования. Я исследую эту тему, и ищу примеры, где использование goto оправдано в плане компактности, эффективности, читабельности кода. Например, goto помогает: * выйти из многоуровневого цикла (где break не справится) * избавиться от структур вложенных if-блоков * ... какие еще примеры? Добавлено через 16 секунд Язык - любой, например Си.
0
|
|
| 21.10.2025, 09:22 | |
|
Ответы с готовыми решениями:
49
Понятие трудоёмкости алгоритма. Понятие эффективного алгоритма
каким образом на схеме изобразить процедуру goto |
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|||
| 27.10.2025, 12:59 | |||
|
А если всё получилось, кто будет вызывать деструкторы? Зачем выполнять "destructor2(&___);", если мы не добрались до строки "if(!(___ = _3rdfn(…)) goto ooops;"?
0
|
|||
|
Windows must die
|
|||||||||
| 27.10.2025, 14:51 | |||||||||
|
Добавлено через 3 минуты
0
|
|||||||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||||||||
| 27.10.2025, 16:08 | ||||||||
|
Добавлено через 1 минуту
0
|
||||||||
|
Windows must die
|
|||||||||||||||||
| 27.10.2025, 17:06 | |||||||||||||||||
|
Shamil1, я имею в виду:
Добавлено через 2 минуты
0
|
|||||||||||||||||
|
Модератор
|
||
| 27.10.2025, 21:17 | ||
|
Я этого языка не знаю но понимаю что там написано.
1
|
||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|||||||||||||
| 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
|
||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||||
| 28.10.2025, 11:29 | ||||
|
0
|
||||
|
322 / 81 / 5
Регистрация: 19.07.2024
Сообщений: 447
|
||
| 28.10.2025, 11:55 | ||
|
* общие точки выхода из большой и развесистой функции (например: точка err: и точка success: в которые имеется множество переходов в пределах функции).
0
|
||
|
Модератор
|
||||
| 28.10.2025, 12:31 | ||||
|
0
|
||||
|
322 / 81 / 5
Регистрация: 19.07.2024
Сообщений: 447
|
||||
| 28.10.2025, 13:14 | ||||
![]() Если использование goto улучшает читаемость и оптимизирует код, то его использование оправдано, а остальные решения - "именно ошибка проектирования". ![]() Если "разделение на функции" ухудшает читаемость и ухудшает оптимальность кода (если она важна), то как раз эта разбивка и будет "ошибка организации кода", а не goto. Добавлено через 4 минуты
1
|
||||
|
Windows must die
|
|
| 28.10.2025, 13:16 | |
|
"Ошибка проектирования" - это бояться goto и не использовать даже там, где без него вообще никак невозможно обойтись!
Вот с longjump нужно аккуратно обращаться, если "прыжки" между функциями выполняются. А goto может сэкономить ресурсы, особенно на микроконтроллерах. Любой вход в функцию связан с уймой накладных расходов. Вот, скажем, чтобы не увеличиать эти расходы в тех случаях, когда мне нужно несколько раз один и тот же блок использовать, а в виде макроса это будет некрасиво или сложно, просто использую вложенные функции. К сожалению, шланг не понимает вложенных функций, поэтому из двух компиляторов остается лишь gcc. Пробовал как-то в обработке изображений избавиться от таких вложенных функций: производительность процентов на пять упала!
0
|
|
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||
| 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
|
|
|
322 / 81 / 5
Регистрация: 19.07.2024
Сообщений: 447
|
|||||||
| 28.10.2025, 17:17 | |||||||
Можно конечно насоздавать тут кучу дополнительных функций. Для каждой ветки. Но код станет гораздо менее читаемым. Если скажем после каждой case Nx идёт 2-3 строки кода, то здесь (с goto) всё на одном экране и легко читаемо. "Грязный трюк" тут будет - налепить кучу ненужных функций.
0
|
|||||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
|||
| 29.10.2025, 09:45 | |||
|
Добавлено через 3 минуты
0
|
|||
|
322 / 81 / 5
Регистрация: 19.07.2024
Сообщений: 447
|
|
| 29.10.2025, 12:08 | |
|
0
|
|
|
Windows must die
|
||||||
| 29.10.2025, 12:29 | ||||||
|
Видимо, имеется в виду вместо goto вызвать вложенную функцию, как здесь:
А если функцию commonN1N2N3 еще и вынести за пределы processstate, так вообще полная фигня получится, если она пользовалась какими-то внутренними переменными последней. Зачем регистры туда-сюда гонять, еще и стек "спасать", если достаточно простого goto?
0
|
||||||
|
Модератор
3132 / 2279 / 469
Регистрация: 26.03.2015
Сообщений: 8,870
|
||||
| 29.10.2025, 15:29 | ||||
|
Добавлено через 6 минут
0
|
||||
|
Windows must die
|
|||
| 29.10.2025, 17:42 | |||
|
Нужно стараться экономить ресурсы: на единицах байтов и наносекундах вполне могут вырасти мегабайты и миллисекунды, что уже плохо. Не по теме:
0
|
|||
| 29.10.2025, 17:42 | |
|
Помогаю со студенческими работами здесь
40
Случаи удачного применения оператора goto Правда ли, что "Goto: за и против" от Дейкстры - явная и сознательная монополизация рынка? посоветоваться о эффективном алгоритме резервирования данных Вопрос об эффективности приминения языков программирования. Как эффективно обрабатывать значение Null? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|