在C语言中使用布尔值

45 浏览
0 Comments

在C语言中使用布尔值

C语言没有内置的布尔类型。在C语言中使用布尔类型的最佳方式是什么?

admin 更改状态以发布 2023年5月23日
0
0 Comments

关于C语言中的布尔值,我有一些想法:

我够老了,只使用普通的int作为我的布尔类型,没有任何typedef、特殊定义或真/假值的枚举类型。如果你遵循下面建议中从不与布尔常量进行比较的方法,那么你只需要使用0/1来初始化标志位。然而,在这个现代化的时代,这种方法可能被认为是过时的。在这种情况下,应该至少使用,因为它至少有一个标准化的好处。

无论布尔常量的名称是什么,只用它们进行初始化。永远不要写像这样的东西

if (ready == TRUE) ...
while (empty == FALSE) ...

可以用更清晰的方式替换

if (ready) ...
while (!empty) ...

请注意,这些实际上可以很合理和易于理解地朗读。

给布尔变量取正面的名称,例如full而不是notfull。后者会导致代码难以轻松阅读。比较一下

if (full) ...
if (!full) ...

if (!notfull) ...
if (notfull) ...

前者都可以自然地读出来,而!notfull甚至在阅读时都很尴尬,在更复杂的布尔表达式中会变得更糟。

应该尽量避免布尔参数。考虑这样定义的函数

void foo(bool option) { ... }

在函数体内,参数的含义非常清晰,因为它有一个方便且有意义的名称。但是,调用站点看起来像

foo(TRUE);
foo(FALSE):

在这里,几乎不可能在不看函数定义或声明的情况下弄清楚参数的含义,一旦添加更多的布尔参数,这种情况会变得更糟。我建议采用

typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);

或者

#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }

无论哪种情况,现在的调用位置看起来像

foo(OPT_ON);
foo(OPT_OFF);

这样读者至少有机会理解,而不需要检索 foo 的定义。

0
0 Comments

从最好到最差:

选项1(C99或更新版本)

#include 

选项2

typedef enum { false, true } bool;

选项3

typedef int bool;
enum { false, true };

选项4

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

解释

  • 选项1仅在使用C99(或更新版本)时有效,这是“标准方法”。如果可以,请选择这个。
  • 选项2、3和4实际上具有完全相同的行为。#2和#3不使用#define,我认为这更好。

如果你还没有决定,选择#1!

0