在C中使用布尔值
C没有任何内置的布尔types。 在C中使用它们的最好方法是什么?
选项1
typedef int bool; #define true 1 #define false 0
选项2
typedef int bool; enum { false, true };
选项3
typedef enum { false, true } bool;
备选案文4(C99)
#include <stdbool.h>
说明
- 选项1,2和3将具有相同的行为。 #2和#3虽然不使用#defines,在我看来是更好的。
- 选项4只有在使用C99时才有效,这是“标准方式”。 如果可能,select这个。
如果你还没有决定,那就去#3吧!
关于C语言中布尔值的一些想法:
我已经够老了,我只是使用plain int
s作为我的布尔types,没有任何typedefs或特殊的定义或枚举true / false值。 如果你按照我的build议,永远不要与布尔常量进行比较,那么你只需要使用0/1来初始化标志。 但是,这种方法在现代也许被认为是过于反动的。 在这种情况下,一定要使用<stdbool.h>
因为它至less具有标准化的好处。
无论调用什么布尔常量,只用于初始化。 永远不要写类似的东西
if (ready == TRUE) ... while (empty == FALSE) ...
这些可以总是被更清楚的代替
if (ready) ... while (!empty) ...
请注意,这些可以合理而可以理解地大声读出来。
给你的布尔variables积极的名字,即full
而不是不notfull
。 后者导致难以阅读的代码。 比较
if (full) ... if (!full) ...
同
if (!notfull) ... if (notfull) ...
前一对都是自然读取的,而!notfull
虽然很难读取,但在更复杂的布尔expression式中变得更糟。
布尔参数通常应该避免。 考虑一个像这样定义的函数
void foo(bool option) { ... }
在这个函数的主体之中,由于它有一个方便的,有希望的有意义的名字,所以这个论证是非常清楚的。 但是,通话网站是这样的
foo(TRUE); foo(FALSE):
在这里,根本不可能告诉参数是什么意思,而不总是看函数定义或声明,并且如果添加更多的布尔参数,它会变得更糟糕。我build议
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);
读者至less有一个理解的机会,而不是疏浚foo
的定义。
C中的布尔值是一个整数:false表示为零,非为零。
另见布尔型数据types , C,C ++,Objective-C,AWK 。
这是我使用的版本:
typedef enum { false = 0, true = !false } bool;
因为false只有一个值,但是逻辑true可以有很多值,但是技术设置为编译器将使用的与false相反的东西。
这照顾到某人编码的问题,这可能归结为这个问题:
if (true == !false)
我认为我们都会同意这不是一个好的做法,但是为了“真假”的一次性成本,我们消除了这个问题。
[编辑]最后我用:
typedef enum { myfalse = 0, mytrue = !myfalse } mybool;
避免与其他定义true
scheme发生名称冲突。 但是这个概念还是一样的。
[编辑]显示整数转换为布尔值:
mybool somebool; int someint = 5; somebool = !!someint;
第一个(最右)! 将非零整数转换为0,然后第二个(最左边)! 将0转换为myfalse
值。 我将把它作为读者的练习来转换一个零整数。
如果您使用的是C99编译器,则它具有对booltypes的内置支持:
#include <stdbool.h> int main() { bool b = false; b = true; }
typedef enum { false = 0, true } t_bool;
C有一个布尔types: bool (至less在过去10(!)年)
包括stdbool.h和true / false将按预期工作。
任何非零值在布尔操作中被评估为真,所以你可以
#define TRUE 1 #define FALSE 0
并使用常量。
@Thomas Matthews:条件expression式被认为是非真的,但是C标准要求逻辑运算符本身返回0或1。
@Tom:#define TRUE!FALSE不好,完全没有意义。 如果头文件进入编译的C ++代码,那么它可能会导致问题:
void foo(bool flag); ... int flag = TRUE; foo(flag);
有些编译器会产生关于int => bool转换的警告。 有时候人们通过这样做来避免
foo(flag == TRUE);
强制expression式是一个C ++布尔。 但是如果你#define TRUE!FALSE,你最终会得到:
foo(flag == !0);
最终做一个int-to-bool的比较,可以触发警告。
你可以简单地使用#define指令,如下所示:
#define TRUE 1 #define FALSE 0 #define NOT(arg) (arg == TRUE)? FALSE : TRUE typedef int bool;
并使用如下:
bool isVisible = FALSE; bool isWorking = TRUE; isVisible = NOT(isVisible);
等等
您可以使用一个字符,或另一个小号码容器。
Pseduo
#define TRUE 1 #define FALSE 0 char bValue = TRUE;
这是:
#define TRUE 1 #define FALSE 0