Использование специального типа данных Arduino "boolean" вместо стандартного типа данных "bool"

c++

Существует специальный, нестандартный тип данных Arduino, называемый "boolean".

Как он сравнивается со стандартным типом данных C ++ "bool" и каковы причины использования того или иного?

Если они идентичны в использовании, почему оба существуют и какой из них предпочтительнее в коде Arduino?

, 👍3

Обсуждение

Это базовый вопрос программирования, не специфичный для Arduino. [The Definitive C++ Book Guide and List] (https://stackoverflow.com/q/388242/669576 ). Или [Google] (https://www.google.com/search ?q=c%2B%2B+логическое значение), @Johnny Mopp

Добро пожаловать на Arduino Stack Exchange. Пожалуйста, пройдите экскурсию по адресу https://arduino.stackexchange.com/Tour чтобы получить максимальную отдачу от этого сайта. Boolean означает двоичный, как true / false . Сделайте поиск в Google в разделе "Типы данных Arduino", чтобы узнать об этом., @SDsolar

Я не согласен с тем, что это не конкретный вопрос Arduino. `boolean" - это нестандартный псевдоним типа для "bool", установленного в библиотеке Arduino core, и поэтому он очень специфичен для Arduino. Подробности смотрите в моем ответе., @per1234

Переименование чего-то не означает, что оно специфично для Arduino., @Avamander


3 ответа


1

Тип булевой переменной - это переменная, которая имеет только 2 возможных значения: true или false. Внутренне он создается как int (16-битное целое число) или тип uint8_t (8-битное целое число).

Вы можете присвоить "значения" true или false с помощью оператора присваивания:

bool foo;
foo = true;
if (foo) {
  do_something();
}

Внутренне true - это 1, а false - 0, и числовые значения могут быть одинаково подставлены.

Булевы типы в Arduino и C ++ в основном существуют для удобочитаемости, а не для какой-либо конкретной эффективности по сравнению с типом int.

,

1

Официальную ссылку можно найти здесь

Лучше всего всегда использовать true и false, а не цифры.

Ниже приведены некоторые примеры

Присвоить логическому значению false resp true:

bool a = true;
bool b = false;

Проверьте логическое значение:

if (b)
{
   // Выполняется, когда b равно true
}
else
{
   // Выполняется, когда b равно false
}

if (a && b)
{
   // Выполняется, когда a истинно, а b истинно
}

if (a || b)
{
   // Выполняется, когда a равно true или b равно true
}

Если b ложно, то a будет ложным, в противном случае a останется таким, каким оно было

a &= b;

Если b истинно, то a будет истинно, в противном случае a останется таким, каким оно было

a |= b;

// Если a истинно, то оно будет ложным и наоборот.

a = !a;
,

Этот последний должен быть a = !a не так ли? ~ - это побитовое нет. В зависимости от того, как определяется true ~true все еще может быть true., @Delta_G


8

В то время как другие ответы дают в целом полезную информацию, авторы, похоже, не очень внимательно прочитали вопрос, потому что они говорят о типе bool, а не о логическом типе. В API Arduino boolean - это псевдоним типа для bool, как определено в Arduino.h:

https://github.com/arduino/Arduino/blob/1.8.3/hardware/arduino/avr/cores/arduino/Arduino.h#L125

typedef bool boolean;

Таким образом, вы можете использовать логический тип так же, как и bool, и любой стандартный справочник по программированию на C ++ проинструктирует вас об использовании bool. По этой причине другие ответы, которые ошибочно ссылаются на bool, все еще несколько полезны.

Очевидно, в какой-то момент в прошлом люди Arduino решили, что имя boolean будет более удобным для начинающих, чем bool, возможно, чтобы соответствовать языку обработки. Однако, как обсуждалось здесь:

https://github.com/arduino/Arduino/issues/4673

ненужное использование нестандартного типа в настоящее время считается некоторыми плохим решением, поскольку его использование делает код менее переносимым и на самом деле не дает никакого явного преимущества перед bool. В настоящее время разрабатывается предложение удалить использование boolean из всего официального кода Arduino и документировать bool в справочнике Arduino, а некоторые даже хотят официально отказаться от boolean. Поэтому мой совет - использовать bool вместо boolean в вашем коде.

,