说一下这个基础知识 | 每日一面(58)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:因为在C语言中所有的非零值都被看作 “真”, 是不是把 TRUE 定义为 1 很危险?如果某个内置的函数或关系操作符 “返回” 不是 1 的

其它值怎么办?

小林:C语言中的确任何非零值都都被看作真, 但这仅限于 “输入”, 也就是说, 仅限于需要布尔值的地方。内建操作符生成布尔值时, 可以保证为 1 或 0。

因此, 这样的测试if((a == b) == TRUE)能如愿运行, 但显然这很傻。事实上, 跟 TRUE 和 FALSE的跟 TRUE 和 FALSE 的显示比较都不合适, 因为有些库函数在成功时返回非零值, 但不一定为1。

一般规则是只在向布尔变量赋值或函数参数中才使用 TRUE 和 FALSE, 或者用于函数的返回值, 但决不用于比较。预处理宏 TRUE 和 FALSE只是用于增加代码可读性, 而不是因为其值可能改变。

尽管使用 TRUE 和 FALSE 这样的宏看上去更清楚, 布尔值和定义在C语言中的复杂性让很多程序员觉得 TRUE 和 FALSE 宏不过更令人迷惑, 因而更喜欢使用1 和0。

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完