Оператор IF внутри вызова функции? Справка по коду
Я просматривал библиотеку шаговых двигателей, когда наткнулся на эту строку кода, похожего на иностранный:
digitalWrite(enable_pin, (enable_active_state == HIGH) ? LOW : HIGH);
Это какой-то способ добавить оператор if в вызов функции? Я никогда не видел этого раньше. Что именно он делает и как называется это конкретное расположение кода?
Спасибо!
@HavocRC, 👍1
Обсуждение1 ответ
Лучший ответ:
Вы можете рассматривать это как "выражение if", правильным термином будет "условный оператор" (Стандартная глава С++ 8.16). Многие знают его как "тернарный оператор". потому что у него три операнда. Возможно, вы уже знакомы с "унарным оператором" с одним операндом, таким как знак отрицания -x
или "бинарный оператор" с двумя операндами, такими как сложение a + b
.
Это выражение состоит из:
- первый операнд
- оператор
?
- второй операнд
- оператор
:
- третий операнд
Первый оператор оценивается и преобразуется (при необходимости) в логическое значение.
Если результат true
, вычисляется второй операнд и задается значение выражения.
Если результат false
, вычисляется третий операнд и задается значение выражения.
Вычисляется только один из второго и третьего операндов. Это важно, если вы используете операнды с побочными эффектами, такими как вызовы функций.
К этому оператору часто относятся неодобрительно. При чрезмерном использовании источник становится легко нечитаемым. По этой причине многие профессиональные руководства по стилю кода запрещают его использование.
В вашем случае это можно было бы написать более четко, как
if (enable_active_state == HIGH) {
digitalWrite(enable_pin, LOW);
} else {
digitalWrite(enable_pin, HIGH);
}
Он выводит инвертированное значение переменной enable_active_state
на выводе enable_pin
.
Опытные пользователи Arduino знают, что HIGH
и LOW
представлены в виде, совместимом с логическими значениями. Логические инверсии могут быть проще выражены с помощью логического оператора отрицания:
digitalWrite(enable_pin, !enable_active_state);
В любом случае современные компиляторы обычно достаточно умны, чтобы генерировать один и тот же машинный код для каждого из вариантов. Поэтому, пожалуйста, напишите свой источник наилучшим образом, чтобы выразить свое намерение. Все остальное — это «преждевременная оптимизация», а это плохо. Но это совсем другая тема.
- C++ против языка Arduino?
- Как использовать SPI на Arduino?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Ошибка: expected unqualified-id before 'if'
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Библиотека DHT.h не импортируется
- ошибка: ожидаемое первичное выражение перед токеном ','
Погуглите что-нибудь вроде "тройной оператор С++". Есть много хороших объяснений для этого оператора в Интернете, @chrisl
Вероятно, его можно было бы сократить до этого: digitalWrite(enable_pin, ! enable_active_state) ;, @6v6gt