答案是便携性。 TRUE 和 FALSE 的数值并不重要。 重要的是,像 if (1 < 2) 这样的语句的计算结果为 if (TRUE),而像 if (1 > 2) 这样的语句的计算结果为 if (FALSE)。
当然,在 C 中,(1 < 2) 的计算结果为 1,(1 > 2) 的计算结果为 0,因此正如其他人所说,就编译器而言,没有实际区别。但是,通过让编译器根据自己的规则定义 TRUE 和 FALSE,您可以使它们的含义对程序员明确,并且您可以保证程序和任何其他库的一致性(假设其他库遵循 C 标准...您会感到惊讶)。
一些历史
一些 BASIC 将 FALSE 定义为 0 和 TRUE 定义为 -1。与许多现代语言一样,它们解释任何非零值为TRUE,但它们评估布尔表达式为-1。他们的NOT 操作是通过加 1 和翻转符号来实现的,因为这样做很有效。所以'NOT x'变成了-(x+1)。这样做的副作用是,像 5 这样的值计算为 TRUE,但 NOT 5 计算为 -6,这也是 TRUE!发现这种错误并不好玩。
最佳做法
鉴于 事实上 规则将零解释为 FALSE 而 任何 非零值被解释为 TRUE,您应该永远不要比较布尔值TRUE 或 FALSE 的表达式。例子:
if (thisValue == FALSE) // Don't do this!
if (thatValue == TRUE) // Or this!
if (otherValue != TRUE) // Whatever you do, don't do this!
为什么?因为很多程序员使用把ints 当作bools 对待的捷径。它们不一样,但编译器通常允许这样做。因此,例如,写是完全合法的
if (strcmp(yourString, myString) == TRUE) // Wrong!!!
看起来是合法的,编译器会很乐意接受它,但它可能不会做你想要的。那是因为strcmp()的返回值是
0 如果yourString == myString
yourString < myString
>0 如果yourString > myString
所以上面的行只有在yourString > myString 时才返回TRUE。
正确的做法是
// Valid, but still treats int as bool.
if (strcmp(yourString, myString))
或
// Better: lingustically clear, compiler will optimize.
if (strcmp(yourString, myString) != 0)
同样:
if (someBoolValue == FALSE) // Redundant.
if (!someBoolValue) // Better.
return (x > 0) ? TRUE : FALSE; // You're fired.
return (x > 0); // Simpler, clearer, correct.
if (ptr == NULL) // Perfect: compares pointers.
if (!ptr) // Sleazy, but short and valid.
if (ptr == FALSE) // Whatisthisidonteven.
您经常会在生产代码中发现其中一些“糟糕的示例”,许多有经验的程序员都对它们发誓:它们可以工作,有些比他们(迂腐?)正确的替代方案要短,而且这些习语几乎得到了普遍认可。但请考虑:“正确”版本的效率同样不低,它们保证可移植,甚至可以通过最严格的 linter,甚至新程序员也能理解它们。
这不值得吗?