Возвращает ли bool целое число?
Я знаю, что для Arduino (и C в целом) для сравнения «ложь» равна 0, а любое ненулевое целое число является «истиной». У меня вопрос: «возвращает» ли тип данных bool конкретное целое число для «истины» или «ложи»?
Когда я попробовал Serial.print(true == 1)
, он напечатал 1
(что я считал «истиной»), но когда я попробовал Serial.print(true == 2)
, он напечатал 0
(который я считал «ложным»). Когда я попробовал Serial.print(false == 1)
, он напечатал 0
, а Serial.print(false == 0)
напечатал 1
.
Я не знал, всегда ли значение «истина» оценивается как 1, а значение «ложь» всегда равно 0, или этого не должно происходить.
@Pyro, 👍1
Обсуждение3 ответа
Лучший ответ:
Если вы посмотрите на Arduino.h
, вы увидите true
, false
и bool
, определенные как :
#define true 0x1
#define false 0x0
typedef uint8_t boolean;
Используя простой тестовый скетч, оказывается, что сравнение true
или false
с чем-либо, кроме 1 или 0, «не работает».
void setup(){
Serial.begin(9600);
if(false == 0){Serial.println("false=0");}
if(false == 1){Serial.println("false=1");}
if(false == 2){Serial.println("false=2");}
if(false == -1){Serial.println("false=-1");}
if(true == 0){Serial.println("true=0");}
if(true == 1){Serial.println("true=1");}
if(true == 2){Serial.println("true=2");}
if(true == -1){Serial.println("true=-1");}
}
void loop(){}
истина действительно равна 1, а ложь — 0.
Это соответствует вашим тестам:
(true == 1) -> prints 1, because 1 == 1
(true == 2) -> prints 0, because 1 != 2
(false == 1) -> prints 0, because 0 != 1
В C определены true и false, а bool/boolean — это определение типа (в основном для int, unsigned int или unsigned char), где обычно false определяется как 0, а true — как 1 ИЛИ 255. Таким образом, вы не можете полагаться на определенное значение.
В C++ значения true и false равны соответственно. 1 и 0 при приведении к int.
Bool — это определенный тип данных, основанный на int (и идентичный ему). Причина его существования документальна: название описывает, как вы собираетесь его использовать. Другой разницы нет.
true и false — это константы 1 и 0 соответственно. Если вы присвоите значение «истина» логическому типу или любому другому целочисленному типу, он получит значение «1». Если вы выполняете сравнение или любой другой логический тест (который дает результат «истина» или «ложь»), результат этого теста — числовое значение: 1 или 0.
Однако вы можете оценить (т.е. проверить) любое целочисленное значение логически (истина или ложь): если оно равно нулю, результат будет ложным (0); в противном случае результат будет истинным (1) — независимо от того, какое ненулевое значение имеет само выражение. Это связано с тем, что логические операторы '==', '!=', '>' и т. д. являются (похожими) функциями, которые могут возвращать только одно из двух значений: «истина» и «ложь», независимо от значений. своих входов. Это еще одно значение типа данных bool: когда он применяется к функции, это означает для компилятора и для читателя, что эта функция возвращает либо true, либо false.
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- устаревшее преобразование из строковой константы в 'char*'
Никогда не используйте
if(flag==1)
, даже не используйтеif(flag==true)
, но используйтеif(flag)
, когда переменнаяflag
является логическим или логическим значением. Логическое значение является частью языка C++, а логическое значение создано Arduino. Функция Serial.print печатает целые числа и числа с плавающей запятой, но, к сожалению, не «истина» или «ложь» для логических значений, поэтому она использует целочисленное значение и печатает «1» или «0»., @Jot@Jot, я в основном смотрел, будет ли это то же самое, потому что у меня есть функция
foo(int tf)
, где tf равно 1 или 0, и я просто хотел посмотреть, будет ли tf == true таким же, как tf == 1. Но если принтер переводит true в 1, то то, что я предлагаю, — плохая идея., @Pyro