【问题标题】:c program assign an int to a bool? [closed]c程序将int分配给bool? [关闭]
【发布时间】:2016-07-27 00:29:09
【问题描述】:

我正在编写一个单片机。这是gpio_read_pin() 函数的描述。它返回一个布尔值。

我可以将其分配给int ack 吗?并测试 ack 是 0 还是 1?

谢谢

/**
 * Read the current value of a single pin on a given GPIO port.
 *
 * @param[in] gpio GPIO port index.
 * @param[in] pin Pin of GPIO port to read.
 * @return bool Value of the pin specified on GPIO port.
 */
bool gpio_read_pin(const gpio_t gpio, const uint8_t pin);



void sendCommandSHT(int command)
{

  ...

  int ack;

  ack = gpio_read_pin(QM_GPIO_0, DATA_PIN);

  if (ack != 0) {
      TI_PUTS("Ack Error 0");
  }
}

【问题讨论】:

  • 也许只有我一个人,但似乎有点……毫无意义?
  • 是的,您可以将整数值分配给整数变量。只需确保该值适合变量即可。

标签: c int boolean


【解决方案1】:

原来的C 并没有真正的bool 类型。但是,它通常被定义为:

typedef enum { false = 0, true = 1 } bool;

我可以将它分配给一个 int ack 吗?并测试 ack 是 0 还是 1?

所以对于你的问题 - 是的。


在 C99 中存在bool 类型,使用<stdbool.h>

【讨论】:

  • C 很好 确实 有一个布尔类型!而enum 是严格禁止的。使用stdbool.h
  • @Olaf 不在 C99 之前,已编辑
  • 如果没有另外提及,问题是关于标准 C。目前是 C11。阅读信息页面。而bool 是类型实际名称的宏。
  • @Olaf:“K&R 甚至不是 C89。”这取决于你所说的 K&R 是什么意思。 “K*RC”通常指的是 1978 年出版的 Kernighan & Ritchie (K&R1) 第一版所描述的语言。第二版 K&R2 描述了 1989 年 ANSI 和 1990 ISO C 标准所定义的语言。
  • 你不同意我写的任何东西吗?旧标准正式已过时;每个标准都“取消并替换”了以前的版本。但是旧的标准仍然存在,恕我直言,说它们不是“标准”是荒谬的。它们是标准,而不是当前标准。例如,可以合理地说编译器符合 1990 ISO C 标准;怎么说呢?
【解决方案2】:

是的,您可以将 int 值分配给 bool 对象。两者都是整数类型,值是隐式转换的。

1999 年之前的旧版本 C 没有内置的布尔类型。通常使用以下变通方法;

typedef enum { false, true } bool;

#define false 0
#define true 1
typedef int bool;

对于这样的类型,转换的行为取决于布尔类型是如何定义的。如果boolint 的别名,则转换很简单。如果要转换的值恰好是01,则结果分别为falsetrue。如果该值是其他任何值,您可以获得既不是false 也不是true 的值,但在用作条件时将被视为真(但在比较相等性时不是 true - 所以不要那样做)。对于非零的int 值,您甚至可以获得一个未指定的值,它可能是0(例如,如果bool 被定义为char 并且高位被丢弃)。

如果您无法使用现代 C,无论是因为您拥有 C99 之前的编译器,还是因为您正在处理遗留代码,您可以规范化该值:

int n = 42;
bool b = (n == 0 ? false : true);

bool b = n != 0

bool b = !!n;

C99 增加了一个内置类型_Bool,如果你有#include <stdbool.h>,可以写成bool。转换为_Bool 会自动标准化该值。如果值等于 0,则将 int 转换为类型 _Bool 会产生 0 (false),否则会产生 1 (true)。

【讨论】:

    猜你喜欢
    • 2023-02-22
    • 2012-12-25
    • 2016-07-04
    • 1970-01-01
    • 2018-02-03
    • 2019-01-12
    • 2013-10-15
    • 1970-01-01
    相关资源
    最近更新 更多