Вопрос про switch return и break;
- Войдите на сайт для отправки комментариев
Пт, 15/01/2021 - 00:08
char * GetPinName(byte _pin) { switch (_pin) { case pinA1: return "A1"; case pinA2: return "A2"; case pinD1: return "D1"; case pinD2: return "D2"; default: return "unknown"; } }
Скажите пожалуйста, нужен ли в данной конструкции break для case'ов? Или в данном случает они лишние будут.
нет
Нет. Да.
:) Что-то вы меня запутали) В общем не нужны они я так понял
Добавить можно, но до его выполнения все равно не дойдет ))
Ну вот я и думаю, что return же моментально прерывает выполнение функции, будь он(return) вызван даже в цикле внутри функции...
break тут не нужны, до них просто не дойдет. Но с точки зрения читаемость код так себе, да и разные компиляторы могут по разному оптимизировать такой код в будущем.
Я бы действовал по классике - ввел бы переменную, которой бы в case присваивал нужное значение и выскакивал бы break'ом. А после свитча уже возвращал бы значение переменной. Один раз. Дефолтовое значение ей можно присвоить при объявлении, соответственно default будет не нужен.
У Вас было два вопроса. Я ответил на оба. У Вас всё отлично написано. Ничего больше не надо. Всё будет работать как задумано. При почти минимальном расходе памяти. Только строка unknown выбивается из строя. Сократите до двух символов и будет вообще минимум.
Согласно концепции один вход один выход. Лучше не делать множественный return. А заполнить переменную в функции и вернуть её в конце. Если вы думаете что будет лишняя переменная, то ошибаетесь, переменная в любом случае будет создана , просто в данном случае не явно.
Задолбали уже концепциями. Свидетели не прихода goto и прочие. Чем плох множественный выход? Это здесь можно легко единственный выход. А есть ситуации когда его реализация требует goto. Тоже нельзя?
Извините, а здесь что-то требует нескольких return? Как по мне, нет. И с точки зрения логики - один вход/один выход в подпрограмму - это идеальный сценарий. Если goto ваша любимая игрушка, и как бы без него вы не можете, то это ваше право, но в данном случае к чему вы его приплели - я хз.
Нет, не всегда.
Нет, не всегда.
Ну, наверное я слегка категоричен, да. Вопрос назначения подпрограммы. Но в данном случае - не вижу я смысла в пачке ретурнов. Да и с точки зрения отладки в рамках проекта, мне думается что таки один вход/один выход в базе проще для понимания. Но это мне.
P.S. Хотя goto я тоже использую. Правда, последние годы только в некоторых cmd файлах. ;)
Согласно концепции один вход один выход. Лучше не делать множественный return. А заполнить переменную в функции и вернуть её в конце. Если вы думаете что будет лишняя переменная, то ошибаетесь, переменная в любом случае будет создана , просто в данном случае не явно.
Код функции
char
* GetPinName(
byte
_pin) (а это полная его версия) так то с точки зрения и имеет один выход как не крути :)
Кстати множественный break тоже чем-то "множественный выход из единого куска кода". Мнения разделились и оба они правильные. Все зависит от ситуации. Например если функцию выше переделать с доп переменной, то читаться она лучше не станет, как по мне... Конечно если функция разрослась бы на пару страниц, то может быть с переменной и было бы проще., а так.... Всем спасибо)
Не использование гото это тоже концепция, поэтому я его сюдаи приплёл. Тем более что брейк это стыдливо замаскированный гото.
Не использование гото это тоже концепция, поэтому я его сюдаи приплёл. Тем более что брейк это стыдливо замаскированный гото.
Начнём с того , что всё это jmp , je , jne
break и continue это не замаскированные goto. Это операторы безусловного перехода в совершенно конкретные места локального кода, а не по непонятным меткам. Отличие от goto как раз в этом и есть.
Не существует кода, написанного на С , С++ и выше по уровню , который требовал бы наличия меток.
Самое классное объяснение.
" Сначала спрашиваешь у гуру “Как использовать goto?” - тебе отвечают “Не используй”.
Потом узнаёшь, что есть множество способов сделать это без goto.
Потом узнаёшь много случаев, где goto удобнее других способов.
Потом к тебе подходят и спрашивают “Как использовать goto?”. Ты, немного подумав, отвечаешь: “Не используй”. "
(c) Mr Green
Ну да, конечно. Но и использование меток наличие меток и гото ничем от безметочного кода не отличается. Не требует ,но и не противоречит. И хочу заметить, что что программы для МК и ББ различаются по конечной цели. В МК код обычно прямо работает с периферией, в ББ только через обёртки. У меня несколько раз возникали ситуации на МК, что вываливаться из работы с периферией приходилось из разных мест и переходить по результатам в разные точки программы, при этом главным критерием было быстродействие. Кручение безметочного алгоритма замедляло реакцию. С гото и метками было скорее всего.
Тем более что брейк это стыдливо замаскированный гото.
Тут ничего не скажу. Просто пока не могу придумать где и как.