C语言小碎片六
2017-10-10 17:32
155 查看
C语言中的TRUE和FALSE
C99之前(C99中引入了_Bool),C语言没有内建的bool型变量,通常是使用宏来定义整型或字符型的常量来表示true和false(是的,可能会有人将字符型的常量定义为TRUE和FALSE,因为char型变量位域更紧凑,相对于int型会更节省空间),但通常都会使用int型。通常会使用#define或typedef来进行bool的定义,例如:#define
TRUE 1(或者typedef int bool,甚至可以使用枚举,例如:enum bool {false,true};)。
这一切看着都挺不错的,解决了或者说看似满足了我们的需求,我们有了bool变量,真为1,假为0。但真的如此么?C语言中到底什么是真!任何非0值都被视为逻辑的“真”。我们定义的bool变量实际上没能够真正的表示逻辑的真与假。那么就需要注意一些细节了。很多C代码中都是满足逻辑真、假的,但真值有时候并不是1,例如函数库函数isupper()成功时返回的值就不一定是1。所以类似这种代码:if(isupper(ch)
== TRUE),就是不可靠的(这种风格看似非常明确的样子,但实际上很糟糕)。
通常好的习惯是只在向bool变量赋值或作为函数参量及函数返回值的时候使用TRUE和FALSE,千万不要养成在比较中使用TRUE和FALSE的习惯。
还有一点,在C99中,因为_Bool型变量比较特殊,它只有true和false两个取值,C99标准要求实现中至少能够保存0和1两个值,所以在有的实现中它可能实际只占用1位空间,也有可能是1字节,这和具体实现有关。有个东西还是比较有趣的如果你在代码中使用宏#define
_Bool int ,它是可以通过的。
C99之前(C99中引入了_Bool),C语言没有内建的bool型变量,通常是使用宏来定义整型或字符型的常量来表示true和false(是的,可能会有人将字符型的常量定义为TRUE和FALSE,因为char型变量位域更紧凑,相对于int型会更节省空间),但通常都会使用int型。通常会使用#define或typedef来进行bool的定义,例如:#define
TRUE 1(或者typedef int bool,甚至可以使用枚举,例如:enum bool {false,true};)。
这一切看着都挺不错的,解决了或者说看似满足了我们的需求,我们有了bool变量,真为1,假为0。但真的如此么?C语言中到底什么是真!任何非0值都被视为逻辑的“真”。我们定义的bool变量实际上没能够真正的表示逻辑的真与假。那么就需要注意一些细节了。很多C代码中都是满足逻辑真、假的,但真值有时候并不是1,例如函数库函数isupper()成功时返回的值就不一定是1。所以类似这种代码:if(isupper(ch)
== TRUE),就是不可靠的(这种风格看似非常明确的样子,但实际上很糟糕)。
通常好的习惯是只在向bool变量赋值或作为函数参量及函数返回值的时候使用TRUE和FALSE,千万不要养成在比较中使用TRUE和FALSE的习惯。
还有一点,在C99中,因为_Bool型变量比较特殊,它只有true和false两个取值,C99标准要求实现中至少能够保存0和1两个值,所以在有的实现中它可能实际只占用1位空间,也有可能是1字节,这和具体实现有关。有个东西还是比较有趣的如果你在代码中使用宏#define
_Bool int ,它是可以通过的。
相关文章推荐
- C语言小碎片三
- C语言小碎片九
- 【碎片知识(3)· C语言】malloc函数动态分配内存空间在链表中的应用
- C语言小碎片七
- 知识碎片之C语言
- C语言小碎片二
- 【碎片知识(2)· C语言】链表的建立、输出、特定点的删除和插入以及malloc函数的应用
- C语言—— 将N个数按输入时顺序的逆序排列,用函数实现
- C语言 求数组长度
- C语言实现快速排序算法
- 用C语言写PHP扩展
- C语言打印图形
- C语言学习历程——Training01整数算法训练02
- [置顶] C语言恶作剧(3):锁机(原理及预防方法)
- C语言博客作业--数据类型
- Linux Shell语法速查表(用C语言语法来作对比)
- C语言字符串函数大全
- 2005年华为招聘--C语言笔试试题及参考答案
- C语言中的qsort
- 【C语言】23-typedef