问题:
因为在C 语言中所有的非零值都被看作“真”, 是不是把TRUE 定义为1 很危险?
如果某个内置的函数或关系操作符“返回” 不是1的其它值怎么办?
C 语言中的确任何非零值都都被看作真, 但这仅限于“输入”, 也就是说, 仅限于需要布尔值的地方。
内建操作符生成布尔值时, 可以保证为1 或0。
因此, 这样的测试if((a == b) == TRUE)能如愿运行(只要TRUE 为1), 但显然这很傻。
事实上, 跟TRUE 和FALSE的跟TRUE 和FALSE 的显示比较都不合适, 因为有些库函数(如isupper(),isalpha() 等) 在成功时返回非零值, 但不一定为1。
(再说, 如果你认为“if((a == b)== TRUE)” 比“if(a == b)” 好, 为什么就此打住呢?为什么不使用“if(((a == b)== TRUE) == TRUE)” 呢?)
一般规则是只在向布尔变量赋值或函数参数中才使用TRUE 和FALSE (或类似的东西), 或者用于函数的返回值, 但决不用于比较。
预处理宏TRUE 和FALSE (当然还有NULL) 只是用于增加代码可读性, 而不是因为其值可能改变。
(参见问题5.3 和5.8。)
尽管使用TRUE 和FALSE 这样的宏(或者YES 和NO) 看上去更清楚, 布尔
值和定义在C 语言中的复杂性让很多程序员觉得TRUE 和FALSE 宏不过更令人迷惑, 因而更喜欢使用1 和0。
参见问题5.7。