IF иль не IF - вот в чем вопрос
- Войдите на сайт для отправки комментариев
Ср, 30/05/2018 - 07:39
Накатал вчера функцию для для аналоговой клавиатуры (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? Почему гуру делают так?
Я конечно не гуру, но все зависит от задачи,
В вашем конкретном случае я бы просто if писал
Я, видимо, не гуру, никада так не делаю.
Потому что таких гуру "как собак нерезаных".
Спасибо всем кто откликнулся. А то у меня были сомнения. Вроде все нормально работает, а в глубине души какие-то подозрения...
В данном случае можете не заморачиваться, оставляйте самый первый вариант, с if-return. if...else применяется, если нужно уточнять несколько значений, а switch - это тот же if, только там удобнее записывать сразу несколько case для действия после проверки. if может быть записан switch-ем, а switch - кучкой if-ов. Все они равноценны, что применять в конкретном случае - решает программист.
Возник вопрос, а обязательно ли в данном случае применять if....else или switch, когда в каждой строчке есть return?
Не обязательно.
Почему гуру делают так?
Профессионалы многие вещи делают на автомате - это т.н. почерк по которому профессионала можно узнать. Любитель какждый раз думает, как бы сделать, и делает каждый раз по-разному, профи всегда делает одинаково.
Ваш код лучше уже тем, что не содержит лишних ключевых слов, мешающих его восприятию.
По эффективности с 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 байт.Попробуйте сэкономить ещё (это точно возможно!). Удачи! :))))
..............................
Попробуйте сэкономить ещё (это точно возможно!). Удачи! :))))