Tho*_*ini 996
从最好到更糟:
选项1(C99)
#include <stdbool.h>
Run Code Online (Sandbox Code Playgroud)
选项2
typedef enum { false, true } bool;
Run Code Online (Sandbox Code Playgroud)
选项3
typedef int bool;
enum { false, true };
Run Code Online (Sandbox Code Playgroud)
选项4
typedef int bool;
#define true 1
#define false 0
Run Code Online (Sandbox Code Playgroud)
如果你还未决定,请选择#1!
Dal*_*und 231
关于C中布尔的一些想法:
我已经够老了,我只使用plain int
s作为我的布尔类型,没有任何typedef或特殊定义或枚举的真/假值.如果您按照我的建议从不与布尔常量进行比较,那么您只需要使用0/1来初始化标志.然而,在这些现代时代,这种方法可能被认为过于反动.在这种情况下,一定要使用,<stdbool.h>
因为它至少具有标准化的好处.
无论调用什么布尔常量,只能将它们用于初始化.永远不要写像
if (ready == TRUE) ...
while (empty == FALSE) ...
Run Code Online (Sandbox Code Playgroud)
这些总是可以被清除者取代
if (ready) ...
while (!empty) ...
Run Code Online (Sandbox Code Playgroud)
请注意,这些实际上可以合理且可理解地被大声读出.
给你的布尔变量正名,即full
代替notfull
.后者导致代码难以阅读.相比
if (full) ...
if (!full) ...
Run Code Online (Sandbox Code Playgroud)
同
if (!notfull) ...
if (notfull) ...
Run Code Online (Sandbox Code Playgroud)
前两对都是自然读取的,虽然!notfull
它很难读,但在更复杂的布尔表达式中变得更糟.
通常应避免使用布尔参数.考虑这样定义的函数
void foo(bool option) { ... }
Run Code Online (Sandbox Code Playgroud)
在函数体内,非常清楚参数的含义,因为它具有方便且有希望的有意义的名称.但是,呼叫网站看起来像
foo(TRUE);
foo(FALSE):
Run Code Online (Sandbox Code Playgroud)
在这里,基本上不可能在不总是查看函数定义或声明的情况下告诉参数意味着什么,如果添加更多的布尔参数,它会变得更糟.我建议
typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);
Run Code Online (Sandbox Code Playgroud)
要么
#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,呼叫站点现在看起来像
foo(OPT_ON);
foo(OPT_OFF);
Run Code Online (Sandbox Code Playgroud)
读者至少有机会理解而不需要挖掘定义foo
.
Mic*_*ter 72
这是我使用的版本:
typedef enum { false = 0, true = !false } bool;
Run Code Online (Sandbox Code Playgroud)
因为false只有一个值,但逻辑true可以有很多值,但是技术设置为true,编译器将使用与false相反的值.
这解决了某人编写某些内容的问题:
if (true == !false)
Run Code Online (Sandbox Code Playgroud)
我想我们都同意这不是一个好的做法,但是对于做"真=假"的一次性成本我们消除了这个问题.
[编辑]最后我用过:
typedef enum { myfalse = 0, mytrue = !myfalse } mybool;
Run Code Online (Sandbox Code Playgroud)
避免与定义true
和定义的其他方案发生名称冲突false
.但这个概念仍然是一样的.
[编辑]显示整数到布尔值的转换:
mybool somebool;
int someint = 5;
somebool = !!someint;
Run Code Online (Sandbox Code Playgroud)
第一个(最右边)!将非零整数转换为0,然后是第二个(最左边)!将0转换为myfalse
值.我将把它作为练习让读者转换零整数.
Gar*_*hby 46
如果您使用的是C99编译器,它内置了对bool类型的支持:
#include <stdbool.h>
int main()
{
bool b = false;
b = true;
}
Run Code Online (Sandbox Code Playgroud)
http://en.wikipedia.org/wiki/Boolean_data_type
Ant*_*ala 24
首先要做的事情.C,即ISO/IEC 9899已有19年的布尔类型.在访问这个问题时,这比在业余/学术/专业部分结合的C编程职业的预期时间长得多.我的确超过了大概1 - 2年.这意味着在普通读者完全学习C语言的过程中,C实际上具有布尔数据类型.
对于数据类型,#include <stdbool.h>
和使用true
,false
和bool
.或不包括它,使用_Bool
,1
和0
来代替.
这个答案帖中有各种危险的建议.我会解决他们:
typedef int bool;
#define true 1
#define false 0
Run Code Online (Sandbox Code Playgroud)
这是禁忌,因为一个随便的读者 - 在这19年内确实学过C - 会期望它bool
指的是实际的 bool
数据类型,并且行为类似,但事实并非如此!例如
double a = ...;
bool b = a;
Run Code Online (Sandbox Code Playgroud)
使用C99 bool
/时_Bool
,b
将设置为false
iff a
为零,true
否则.随着typedef
到位,double
将被强制转换为一个int
-如果双重的价值不在该范围内int
,该行为是不确定的.
当然,同样适用于if true
和false
被声明的enum
.
宣告更危险的是什么
typedef enum bool {
false, true
} bool;
Run Code Online (Sandbox Code Playgroud)
因为现在除了1和0之外的所有值都是无效的,并且如果将这样的值赋给该类型的变量,则行为将完全未定义.
因此,如果您因某些无法解释的原因无法使用C99,那么对于布尔变量,您应该使用:
int
和值0
以及1
原样 ; 并通过双重否定小心地将域转换从任何其他值转换为这些值!!
BOOL
,TRUE
和FALSE
!mou*_*iel 18
typedef enum {
false = 0,
true
} t_bool;
Run Code Online (Sandbox Code Playgroud)
dme*_*ter 13
C有一个布尔类型:bool(至少在最后10(!)年)
包含stdbool.h和true/false将按预期工作.
gga*_*ett 10
在布尔运算中,任何非零值都会被计算为true,所以你可以这样做
#define TRUE 1
#define FALSE 0
Run Code Online (Sandbox Code Playgroud)
并使用常量.
如果您被允许使用 C99,则只是对其他答案的补充和一些说明。
+-------+----------------+-------------------------+--------------------+
| Name | Characteristic | Dependence in stdbool.h | Value |
+-------+----------------+-------------------------+--------------------+
| _Bool | Native type | Don't need header | |
+-------+----------------+-------------------------+--------------------+
| bool | Macro | Yes | Translate to _Bool |
+-------+----------------+-------------------------+--------------------+
| true | Macro | Yes | Translate to 1 |
+-------+----------------+-------------------------+--------------------+
| false | Macro | Yes | Translate to 0 |
+-------+----------------+-------------------------+--------------------+
Run Code Online (Sandbox Code Playgroud)
我的一些偏好:
_Bool
或者bool
?两者都很好,但bool
看起来比关键字更好_Bool
。bool
和_Bool
是:false
或true
。赋值0
or1
代替false
ortrue
是有效的,但更难阅读和理解逻辑流程。来自标准的一些信息:
_Bool
不是unsigned int
,而是无符号整数类型组的一部分。它足够大以保存值0
or 1
。bool
true
,false
但肯定不是一个好主意。这种能力被认为是过时的,将来会被移除。_Bool
或bool
,如果标量值等于0
或0
与之比较0
,则为 ,否则结果为1
:分配给 时_Bool x = 9;
9
转换1
为x
。_Bool
是 1 个字节(8 位),通常程序员很想尝试使用其他位,但不推荐,因为给出的唯一保证是只有一位用于存储数据,而不像类型char
有 8位可用。