C语言 | 每日基础(47)

2020-09-08 10:29:05 浏览数 (1)

古代的剑客们与

对手相逢时,无

论对手多么强大,

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

读者:因为在 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。

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

——图灵

0 人点赞