【问题标题】:How to use boolean datatype in C?如何在 C 中使用布尔数据类型?
【发布时间】:2011-05-08 18:22:24
【问题描述】:

我只是用 C 编写代码,结果发现它没有布尔/布尔数据类型。是否有任何 C 库可以包含以使我能够返回 boolean/bool 数据类型?

【问题讨论】:

  • 通常使用一个普通的旧 'int',假设 0 是 'false' 而其他都是 'true'。
  • Is bool a native C type?的可能重复

标签: c types boolean


【解决方案1】:

如果你有一个支持 C99 的编译器,你可以

#include <stdbool.h>

否则,您可以根据需要定义自己的。根据您的使用方式(以及您是否希望能够将代码编译为 C++),您的实现可能很简单:

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

不过,在我看来,您不妨只使用int 并使用零表示错误,使用非零表示正确。这就是它通常在 C 中完成的方式。

【讨论】:

  • @James,它奏效了。但是我应该返回什么?我的意思是 0 还是假?
  • @ysap:我选择宏是因为它更接近 C99 所做的(在 C99 中,truefalse 都是分别被 10 替换的宏,并且bool 是一个扩展为布尔类型 _Bool 的宏。
  • @its:如果为booltruefalse 定义宏,则将返回类型设为bool 并返回false。否则,只需将您的返回类型设为int 并返回0。这取决于你想做什么。我只是认为非宏观方法更好。
  • @James - 抱歉,我搞砸了这条评论,在编辑时将其删除,所以我将其重新发布为答案。你回复得太快了……
  • 我实际上更喜欢在 C 中使用 0 作为 false 和非零作为 true 而没有特定类型。在调用可能失败的其他情况下,0 表示成功,NZ 是错误代码(通常为负代码)。
【解决方案2】:

实际上,C99 有一个布尔数据类型,但如果您必须使用旧版本,只需定义一个类型:

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

【讨论】:

  • 如果你问我,“模仿”bool C99 之前的版本是危险的,因为语义不同。 (bool)2 产生 2,而不是 1。更现实的例子:1U&lt;&lt;(bool)isdigit(c) 在大多数实现中都会给出错误的结果。
【解决方案3】:

C99 有一个bool 类型。要使用它,

#include <stdbool.h>

【讨论】:

  • James McNellis 的 answer 已经说过要这样做。
【解决方案4】:

作为 James McNellis 答案的替代方案,我总是尝试对 bool 类型使用枚举而不是宏:typedef enum bool {false=0; true=1;} bool;。 b/c 更安全,它允许编译器进行类型检查并消除宏扩展竞争

【讨论】:

  • 这并不妨碍你说bool b = 1;
  • 据我所知,对于使用 #define bool int 获得的内容,没有额外的类型检查。
  • 哦,我想我明白你的意思了。不过,你说的是变量声明,我说的是真假标记的实际使用。
  • 你能举个例子说明在哪里进行了额外的类型检查吗?
  • 嗯,确实很难,但这只是一个例子:float f; f = true; 应该对隐式(并且可能不兼容)类型转换发出警告。
【解决方案5】:

C99 引入了 _Bool 作为内在纯布尔类型。不需要#includes:

int main(void)
{
  _Bool b = 1;
  b = 0;
}

在真正符合 C99(或更高版本)的 C 编译器上,上述代码应该可以完美编译。

【讨论】:

    【解决方案6】:

    我们可以为此使用枚举类型。我们不需要库。 例如

               enum {false,true};
    

    false 的值为 0,true 的值为 1。

    【讨论】:

      【解决方案7】:
      struct Bool {
          int true;
          int false;
      }
      
      int main() {
      
          /* bool is a variable of data type – bool*/
          struct Bool bool;
      
          /*below I’m accessing struct members through variable –bool*/ 
          bool = {1,0};
          print("Student Name is: %s", bool.true);
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-25
        • 2019-12-27
        • 2011-06-13
        • 2011-08-13
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多