C没有任何内置的布尔类型 . 在C中使用它们的最佳方法是什么?
@Thomas Matthews:如果条件表达式非零,则认为条件表达式为真,但C标准要求逻辑运算符本身返回0或1 .
@Tom:#define TRUE!FALSE很糟糕,完全没有意义 . 如果头文件进入编译的C代码,那么它可能会导致问题:
void foo(bool flag); ... int flag = TRUE; foo(flag);
有些编译器会生成关于int => bool转换的警告 . 有时候人们通过以下方式来避免
foo(flag == TRUE);
迫使表达式成为C bool . 但如果你#define TRUE!FALSE,你最终得到:
foo(flag == !0);
最终做了一个int-to-bool比较,无论如何都可以触发警告 .
typedef enum { false = 0, true } t_bool;
Option 1
typedef int bool; #define true 1 #define false 0
Option 2
typedef int bool; enum { false, true };
Option 3
typedef enum { false, true } bool;
Option 4 (C99)
#include <stdbool.h>
选项1,2和3在实践中将具有相同的相同行为 . #2和#3不使用#defines,在我看来更好 .
选项4仅在您使用C99且"standard way"才能使用时才有效 . 如果可能请选择此项 .
如果你还未定,请选择#3!
C中的布尔值是一个整数:零表示假,非零表示真 .
另见Boolean data type, section C, C++, Objective-C, AWK .
您可以简单地使用#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);
等等
在布尔运算中,任何非零值都会被计算为true,所以你可以这样做
#define TRUE 1 #define FALSE 0
并使用常量 .
首先要做的事情 . C,即ISO / IEC 9899具有 19 years now 的布尔类型 . 这比参加 this question 的业余/学术/专业部分的C编程生涯的长度更长 . 我的确超过了大约1 - 2年 . 但是,在 that an average reader has learnt anything at all about C, C actually has had the boolean data type 期间 .
对于数据类型 #include <stdbool.h> ,并使用 true , false 和 bool . 或者不包含它,并使用(_True,_False和) _Bool 代替 .
true
false
bool
_Bool
在这个答案线程中有各种 dangerous 建议 . 我会解决他们:
这是禁忌,因为一个随意的读者 - 在这19年内确实学过C - 会期望 bool 指的是 actual bool 数据类型并且表现相似,但事实并非如此!例如
double a = ...; bool b = a;
对于C99 bool / _Bool , b 将设置为 false iff a 为零,否则为 true . 在 typedef 就位的情况下, double 将被强制转换为 int - 如果double的值不在 int 的范围内,则为 behaviour is undefined .
b
a
typedef
double
int
当然,如果在 enum 中声明了 true 和 false ,则同样适用 .
enum
什么是 more dangerous 正在宣布
typedef enum bool { false, true } bool;
因为现在除了1和0之外 all values 是无效的,并且应该将这样的值分配给该类型的变量 the behaviour would be wholly undefined .
因此 iff 你不能使用C99一些莫名其妙的原因,对于你应该使用的布尔变量:
类型 int 和值 0 和 1 as-is ;并通过双重否定小心地从任何其他值进行域转换 !!
0
1
!!
或者如果你 insist 你不记得0是假的而非零的,至少使用 upper case 以便它们不会与C99概念混淆: BOOL , TRUE 和 FALSE !
BOOL
TRUE
FALSE
就是这个:
这是我使用的版本:
typedef enum { false = 0, true = !false } bool;
因为false只有一个值,但逻辑true可能有很多值,但是技术设置为true,编译器将使用与false相反的值 .
这解决了某人编写某些内容的问题:
if (true == !false)
我想我们都同意这不是一个好的做法,但是对于做“真=假”的一次性成本我们消除了这个问题 .
[编辑]最后我用过:
typedef enum { myfalse = 0, mytrue = !myfalse } mybool;
避免与定义 true 和 false 的其他方案发生名称冲突 . 但这个概念仍然是一样的 .
[编辑]显示整数到布尔值的转换:
mybool somebool; int someint = 5; somebool = !!someint;
第一个(最右边)!将非零整数转换为0,然后是第二个(最左侧)!将0转换为 myfalse 值 . 我将把它作为练习让读者转换零整数 .
myfalse
您可以使用char或其他小数字容器 .
Pseudo-code
#define TRUE 1 #define FALSE 0 char bValue = TRUE;
关于C中布尔的一些想法:
我已经够老了,我只使用普通的 int 作为我的布尔类型,没有任何typedef或特殊定义或枚举的真/假值 . 如果您按照我的建议从不与布尔常量进行比较,那么您只需要使用0/1来初始化标志 . 然而,在这些现代时代,这种方法可能被认为过于反动 . 在这种情况下,一定要使用 <stdbool.h> ,因为它至少具有标准化的好处 .
<stdbool.h>
无论调用什么布尔常量,只能将它们用于初始化 . 永远不能写点东西
if (ready == TRUE) ... while (empty == FALSE) ...
这些总是可以被清除者取代
if (ready) ... while (!empty) ...
请注意,这些实际上可以合理且可理解地被大声读出 .
给你的布尔变量带正号,即 full 而不是 notfull . 后者导致代码难以阅读 . 相比
full
notfull
if (full) ... if (!full) ...
同
if (!notfull) ... if (notfull) ...
前两个对都是自然读取的,而 !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 的定义 .
foo
如果您使用的是C99编译器,它内置了对bool类型的支持:
#include <stdbool.h> int main() { bool b = false; b = true; }
http://en.wikipedia.org/wiki/Boolean_data_type
C有一个布尔类型: bool (至少在最后10(!)年)
包含stdbool.h和true / false将按预期工作 .
13 回答
@Thomas Matthews:如果条件表达式非零,则认为条件表达式为真,但C标准要求逻辑运算符本身返回0或1 .
@Tom:#define TRUE!FALSE很糟糕,完全没有意义 . 如果头文件进入编译的C代码,那么它可能会导致问题:
有些编译器会生成关于int => bool转换的警告 . 有时候人们通过以下方式来避免
迫使表达式成为C bool . 但如果你#define TRUE!FALSE,你最终得到:
最终做了一个int-to-bool比较,无论如何都可以触发警告 .
Option 1
Option 2
Option 3
Option 4 (C99)
解释
选项1,2和3在实践中将具有相同的相同行为 . #2和#3不使用#defines,在我看来更好 .
选项4仅在您使用C99且"standard way"才能使用时才有效 . 如果可能请选择此项 .
如果你还未定,请选择#3!
C中的布尔值是一个整数:零表示假,非零表示真 .
另见Boolean data type, section C, C++, Objective-C, AWK .
您可以简单地使用#define指令,如下所示:
使用方法如下:
等等
在布尔运算中,任何非零值都会被计算为true,所以你可以这样做
并使用常量 .
首先要做的事情 . C,即ISO / IEC 9899具有 19 years now 的布尔类型 . 这比参加 this question 的业余/学术/专业部分的C编程生涯的长度更长 . 我的确超过了大约1 - 2年 . 但是,在 that an average reader has learnt anything at all about C, C actually has had the boolean data type 期间 .
对于数据类型
#include <stdbool.h>
,并使用true
,false
和bool
. 或者不包含它,并使用(_True,_False和)_Bool
代替 .在这个答案线程中有各种 dangerous 建议 . 我会解决他们:
这是禁忌,因为一个随意的读者 - 在这19年内确实学过C - 会期望
bool
指的是 actualbool
数据类型并且表现相似,但事实并非如此!例如对于C99
bool
/_Bool
,b
将设置为false
iffa
为零,否则为true
. 在typedef
就位的情况下,double
将被强制转换为int
- 如果double的值不在int
的范围内,则为 behaviour is undefined .当然,如果在
enum
中声明了true
和false
,则同样适用 .什么是 more dangerous 正在宣布
因为现在除了1和0之外 all values 是无效的,并且应该将这样的值分配给该类型的变量 the behaviour would be wholly undefined .
因此 iff 你不能使用C99一些莫名其妙的原因,对于你应该使用的布尔变量:
类型
int
和值0
和1
as-is ;并通过双重否定小心地从任何其他值进行域转换!!
或者如果你 insist 你不记得0是假的而非零的,至少使用 upper case 以便它们不会与C99概念混淆:
BOOL
,TRUE
和FALSE
!就是这个:
这是我使用的版本:
因为false只有一个值,但逻辑true可能有很多值,但是技术设置为true,编译器将使用与false相反的值 .
这解决了某人编写某些内容的问题:
我想我们都同意这不是一个好的做法,但是对于做“真=假”的一次性成本我们消除了这个问题 .
[编辑]最后我用过:
避免与定义
true
和false
的其他方案发生名称冲突 . 但这个概念仍然是一样的 .[编辑]显示整数到布尔值的转换:
第一个(最右边)!将非零整数转换为0,然后是第二个(最左侧)!将0转换为
myfalse
值 . 我将把它作为练习让读者转换零整数 .您可以使用char或其他小数字容器 .
Pseudo-code
关于C中布尔的一些想法:
我已经够老了,我只使用普通的
int
作为我的布尔类型,没有任何typedef或特殊定义或枚举的真/假值 . 如果您按照我的建议从不与布尔常量进行比较,那么您只需要使用0/1来初始化标志 . 然而,在这些现代时代,这种方法可能被认为过于反动 . 在这种情况下,一定要使用<stdbool.h>
,因为它至少具有标准化的好处 .无论调用什么布尔常量,只能将它们用于初始化 . 永远不能写点东西
这些总是可以被清除者取代
请注意,这些实际上可以合理且可理解地被大声读出 .
给你的布尔变量带正号,即
full
而不是notfull
. 后者导致代码难以阅读 . 相比同
前两个对都是自然读取的,而
!notfull
甚至不像它那样难以阅读,并且在更复杂的布尔表达式中变得更糟 .通常应避免使用布尔参数 . 考虑这样定义的函数
在函数体内,非常清楚参数的含义,因为它具有方便且有希望的有意义的名称 . 但是,呼叫网站看起来像
在这里,基本上不可能在不总是查看函数定义或声明的情况下告诉参数意味着什么,如果添加更多的布尔参数,它会变得更糟 . 我建议
要么
在任何一种情况下,呼叫站点现在看起来像
读者至少有机会理解而没有挖掘
foo
的定义 .如果您使用的是C99编译器,它内置了对bool类型的支持:
http://en.wikipedia.org/wiki/Boolean_data_type
C有一个布尔类型: bool (至少在最后10(!)年)
包含stdbool.h和true / false将按预期工作 .