Вопрос про switch return и break;

AsNik
Offline
Зарегистрирован: 24.10.2020
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'ов? Или в данном случает они лишние будут.

negavoid2
negavoid2 аватар
Offline
Зарегистрирован: 06.05.2020

нет

nik182
Offline
Зарегистрирован: 04.05.2015

Нет. Да.

AsNik
Offline
Зарегистрирован: 24.10.2020

:) Что-то вы меня запутали) В общем не нужны они я так понял

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Добавить можно, но до его выполнения все равно не дойдет ))

AsNik
Offline
Зарегистрирован: 24.10.2020

Ну вот я и думаю, что return же моментально прерывает выполнение функции, будь он(return) вызван даже в цикле внутри функции...

Чечако
Offline
Зарегистрирован: 15.06.2018

break тут не нужны, до них просто не дойдет. Но с точки зрения читаемость код так себе, да и разные компиляторы могут по разному оптимизировать такой код в будущем.

Я бы действовал по классике - ввел бы переменную, которой бы в case присваивал нужное значение и выскакивал бы break'ом. А после свитча уже возвращал бы значение переменной. Один раз. Дефолтовое значение ей можно присвоить при объявлении, соответственно default будет не нужен.

nik182
Offline
Зарегистрирован: 04.05.2015

У Вас было два вопроса. Я ответил на оба. У Вас всё отлично написано. Ничего больше не надо. Всё будет работать как задумано. При почти минимальном расходе памяти. Только строка unknown выбивается из строя. Сократите до двух символов и будет вообще минимум.

sumi
Offline
Зарегистрирован: 28.04.2020

Согласно концепции один вход один выход.  Лучше не делать множественный return. А заполнить переменную в функции и вернуть её в конце. Если вы думаете что будет лишняя переменная, то ошибаетесь, переменная в любом случае будет создана , просто в данном случае не явно.

 

nik182
Offline
Зарегистрирован: 04.05.2015

Задолбали уже концепциями. Свидетели не прихода goto и прочие. Чем плох множественный выход? Это здесь можно легко единственный выход. А есть ситуации когда его реализация требует goto. Тоже нельзя?

Чечако
Offline
Зарегистрирован: 15.06.2018

nik182 пишет:
Задолбали уже концепциями. Свидетели не прихода goto и прочие. Чем плох множественный выход? Это здесь можно легко единственный выход. А есть ситуации когда его реализация требует goto. Тоже нельзя?

Извините, а здесь что-то требует нескольких return? Как по мне, нет. И с точки зрения логики - один вход/один выход в подпрограмму - это идеальный сценарий. Если goto ваша любимая игрушка, и как бы без него вы не можете, то это ваше право, но в данном случае к чему вы его приплели - я хз. 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Чечако пишет:
с точки зрения логики - один вход/один выход в подпрограмму - это идеальный сценарий.

Нет, не всегда.

Чечако
Offline
Зарегистрирован: 15.06.2018

DetSimen пишет:

Нет, не всегда.

Ну, наверное я слегка категоричен, да. Вопрос назначения подпрограммы. Но в данном случае - не вижу я смысла в пачке ретурнов. Да и с точки зрения отладки в рамках проекта, мне думается что таки один вход/один выход в базе проще для понимания. Но это мне. 

P.S. Хотя goto я тоже использую. Правда, последние годы только в некоторых cmd файлах. ;)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sumi пишет:

Согласно концепции один вход один выход.  Лучше не делать множественный return. А заполнить переменную в функции и вернуть её в конце. Если вы думаете что будет лишняя переменная, то ошибаетесь, переменная в любом случае будет создана , просто в данном случае не явно.

Мне кажется, даже для Паскаля это - несколько через край.

AsNik
Offline
Зарегистрирован: 24.10.2020

Цитата:
с точки зрения логики - один вход/один выход в подпрограмму

Код функции char * GetPinName(byte _pin) (а это полная его версия) так то с точки зрения и имеет один выход как не крути :)

Кстати множественный break тоже чем-то "множественный выход из единого куска кода". Мнения разделились и оба они правильные. Все зависит от ситуации. Например если функцию выше переделать с доп переменной, то читаться она лучше не станет, как по мне... Конечно если функция разрослась бы на пару страниц, то может быть с переменной и было бы проще., а так.... Всем спасибо)

nik182
Offline
Зарегистрирован: 04.05.2015

Не использование гото это тоже концепция, поэтому я его сюдаи приплёл. Тем более что брейк это стыдливо замаскированный гото. 

sumi
Offline
Зарегистрирован: 28.04.2020

nik182 пишет:

Не использование гото это тоже концепция, поэтому я его сюдаи приплёл. Тем более что брейк это стыдливо замаскированный гото. 

Начнём с того , что всё это jmp , je , jne
break и continue это не замаскированные goto. Это операторы безусловного перехода в совершенно конкретные места локального кода, а не по непонятным меткам. Отличие от goto как раз в этом и есть.
Не существует кода, написанного на С , С++ и выше по уровню , который требовал бы наличия меток.

Самое классное объяснение.
" Сначала спрашиваешь у гуру “Как использовать goto?” - тебе отвечают “Не используй”.
Потом узнаёшь, что есть множество способов сделать это без goto.
Потом узнаёшь много случаев, где goto удобнее других способов.
Потом к тебе подходят и спрашивают “Как использовать goto?”. Ты, немного подумав, отвечаешь: “Не используй”. "
(c) Mr Green
 

nik182
Offline
Зарегистрирован: 04.05.2015

Ну да, конечно. Но и использование меток наличие меток и гото ничем от безметочного кода не отличается. Не требует ,но и не противоречит. И хочу заметить, что что программы для МК и ББ различаются по конечной цели. В МК код обычно прямо работает с периферией, в ББ только через обёртки. У меня несколько раз возникали ситуации на МК, что вываливаться из работы с периферией приходилось из разных мест и переходить по результатам в разные точки программы, при этом главным критерием было быстродействие. Кручение безметочного алгоритма замедляло реакцию. С гото и метками было скорее всего.  

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

nik182 пишет:

Тем более что брейк это стыдливо замаскированный гото. 

В таком случае } - это во многих случаях тоже замаскированный GOTO.

nik182
Offline
Зарегистрирован: 04.05.2015

Тут ничего не скажу. Просто пока не могу придумать где и как.