IF иль не IF - вот в чем вопрос

Joiner
Offline
Зарегистрирован: 04.09.2014

Накатал вчера функцию для для аналоговой клавиатуры (5 клавиш с резистивным делителем)

Функция выглядит так

int getPressedButton()//Обработка нажатия клавиш. Возвращает значение клавиши.
{
  int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0)
    if(buttonValue<70) return L;
    if(buttonValue<231) return S;
    if(buttonValue<410) return D;
    if(buttonValue<616) return R;
    if(buttonValue<879) return U;
    return N;
}

Потом посмотрел в интернете, как это делают умные люди, и увидел, что они все применяют  if....else или switch...

примерно так

byte key(){  
  int val = analogRead(0); // считываем значение с аналогового входа в переменную val
    if (val < 50) return 1; // сверяем переменную, если val меньше 50 возвращаем 1 (первая кнопка)
    else if (val < 150) return 2; // если val меньше 150 вторая кнопка и т.д.
 
    else if (val < 350) return 5;
    else if (val < 500) return 4;
    else if (val < 800) return 3;
    else return 0;  // если ничего не подошло возвращаем 0
}

Возник вопрос, а обязательно ли в данном случае применять  if....else или switch, когда в каждой строчке есть return? Почему гуру делают так?

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Я конечно не гуру, но все зависит от задачи,
В вашем конкретном случае я бы просто if писал

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

Я, видимо, не гуру, никада так не делаю.

Green
Offline
Зарегистрирован: 01.10.2015

Joiner пишет:
Почему гуру делают так?

Потому что таких гуру "как собак нерезаных".

Joiner
Offline
Зарегистрирован: 04.09.2014

Спасибо всем кто откликнулся. А то у меня были сомнения.  Вроде все нормально работает, а в глубине души какие-то подозрения...

negavoid
Offline
Зарегистрирован: 09.07.2016

В данном случае можете не заморачиваться, оставляйте самый первый вариант, с if-return. if...else применяется, если нужно уточнять несколько значений, а switch - это тот же if, только там удобнее записывать сразу несколько case для действия после проверки. if может быть записан switch-ем, а switch - кучкой if-ов. Все они равноценны, что применять в конкретном случае - решает программист.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Joiner пишет:

Возник вопрос, а обязательно ли в данном случае применять  if....else или switch, когда в каждой строчке есть return

Не обязательно.

Joiner пишет:

Почему гуру делают так?

Профессионалы многие вещи делают на автомате - это т.н. почерк по которому профессионала можно узнать. Любитель какждый раз думает, как бы сделать, и делает каждый раз по-разному, профи всегда делает одинаково.

Ваш код лучше уже тем, что не содержит лишних ключевых слов, мешающих его восприятию.

По эффективности с else или без else - абсолютно одниаково (по крайней мере, при опциях оптимизации "из коробки").

Если Вы любитель поиграть в игру "а дай-ка я ещё байтик сэкономлю" (как некоторые из коллег по форуму), то могу предложить Вам затравку, которая чуть-чуть лучше Вашего варианта. Точно говорю, что можно сэкономить ещё, но это уже задачка для Вас - ищите :)

Итак, игра "дай-ка я сэкономлю".

Ваш вариант:

static int getVal(void) {
	const int buttonValue = analogRead(0);
	if(buttonValue<70) return 1;
	if(buttonValue<231) return 2;
	if(buttonValue<410) return 3;
	if(buttonValue<616) return 4;
	if(buttonValue<879) return 5;
	return 6;
}

void setup() {analogWrite(3, getVal());}void loop() {}

//Скетч использует 954 байт (3%) памяти устройства. Всего доступно 30720 байт.
//Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

Вариант на "копейку" экономнее по памяти

static int getVal(void) {
	const int v = analogRead(0);
	return 
		v < 70 ? 1 : 
			v < 231 ? 2 : 
				v < 240 ? 3 :
					v < 616 ? 4 :
						v < 879 ? 5 : 6;
}

void setup() {analogWrite(3, getVal());}void loop() {}

//Скетч использует 952 байт (3%) памяти устройства. Всего доступно 30720 байт.
//Глобальные переменные используют 9 байт (0%) динамической памяти, оставляя 2039 байт для локальных переменных. Максимум: 2048 байт.

Попробуйте сэкономить ещё (это точно возможно!). Удачи! :))))

Joiner
Offline
Зарегистрирован: 04.09.2014

ЕвгенийП пишет:

..............................

Попробуйте сэкономить ещё (это точно возможно!). Удачи! :))))

Спасибо. Хоть это и не моя специализация...... , но попробую :)