Оператор IF внутри вызова функции? Справка по коду

c++

Я просматривал библиотеку шаговых двигателей, когда наткнулся на эту строку кода, похожего на иностранный:

digitalWrite(enable_pin, (enable_active_state == HIGH) ? LOW : HIGH);

Это какой-то способ добавить оператор if в вызов функции? Я никогда не видел этого раньше. Что именно он делает и как называется это конкретное расположение кода?

Спасибо!

, 👍1

Обсуждение

Погуглите что-нибудь вроде "тройной оператор С++". Есть много хороших объяснений для этого оператора в Интернете, @chrisl

Вероятно, его можно было бы сократить до этого: digitalWrite(enable_pin, ! enable_active_state) ;, @6v6gt


1 ответ


Лучший ответ:

6

Вы можете рассматривать это как "выражение 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);

В любом случае современные компиляторы обычно достаточно умны, чтобы генерировать один и тот же машинный код для каждого из вариантов. Поэтому, пожалуйста, напишите свой источник наилучшим образом, чтобы выразить свое намерение. Все остальное — это «преждевременная оптимизация», а это плохо. Но это совсем другая тема.

,