经验分享 – 基础知识 | 每日一练(85)

基础知识练习

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭

学生:因为在 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) 只是用于增加代码可读性, 而 不是因为其值可能改变。

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

正文完