9.2关于C语言中True的问题
问题:因为在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。
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。