Возвращает ли 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, или этого не должно происходить.

, 👍1

Обсуждение

Никогда не используйте 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


3 ответа


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

1

Если вы посмотрите на 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(){}
,

0

истина действительно равна 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.

,

0

Bool — это определенный тип данных, основанный на int (и идентичный ему). Причина его существования документальна: название описывает, как вы собираетесь его использовать. Другой разницы нет.

true и false — это константы 1 и 0 соответственно. Если вы присвоите значение «истина» логическому типу или любому другому целочисленному типу, он получит значение «1». Если вы выполняете сравнение или любой другой логический тест (который дает результат «истина» или «ложь»), результат этого теста — числовое значение: 1 или 0.

Однако вы можете оценить (т.е. проверить) любое целочисленное значение логически (истина или ложь): если оно равно нулю, результат будет ложным (0); в противном случае результат будет истинным (1) — независимо от того, какое ненулевое значение имеет само выражение. Это связано с тем, что логические операторы '==', '!=', '>' и т. д. являются (похожими) функциями, которые могут возвращать только одно из двух значений: «истина» и «ложь», независимо от значений. своих входов. Это еще одно значение типа данных bool: когда он применяется к функции, это означает для компилятора и для читателя, что эта функция возвращает либо true, либо false.

,