是否有充分的理由用布尔值检查相等性?

问题描述

修改了一些芯片制造商的示例代码删除一堆我认为愚蠢的布尔比较,例如:

  • if(var == TRUE)if(var)
  • if(TRUE == var)if(var)
  • if(var != TRUE)if(!var)
  • if(FALSE == var)if(!var)
  • if(TRUE == var1 || TRUE == var2)if(var1 || var2)
  • if(func() != FALSE)if(func())
  • if(func() == TRUE)if(func())

地点:

#define TRUE                                   1
#define FALSE                                  0

我认为这会使代码更具可读性,甚至可能让编译器优化得更好一点,但编译后的代码大小增加了 118 个字节。

我错过了什么吗?这些在逻辑上应该是等价的,对吗?

解决方法

啊,这是我的头顶,但是:

8051 有一条指令以寄存器中的单个位JBJNB 为条件进行跳转。如果您的编译器知道要检查哪个位,它可以使用它。

或者,您可以检查累加器中的值是否为 0、JZJNZ。但要使其工作,您可能需要先将值放在累加器上,这可能需要清除并移动到该值,从而增加开销。

如果您的编译器不是非常老派,请使用内置但不是很标准的 _Bool 或类似的“伪类型”,您的编译器将像它可以(并且可能做你想做的事)。

,

这不仅没有必要,而且是个坏主意。只有与 FALSE 进行比较是安全的,因为任何非零值都隐式为 true,但将此类值与 TRUE 进行比较可能会失败。

你做对了。虽然您可能需要考虑维护。如果供应商更新此代码,您可能必须重新应用所有更改。通常,按原样使用第三方代码会更简单;没有这样的代码会符合您特定的本地编码标准或风格 - 可能不仅仅是这样。忍受或不使用它;当然不要复制它。

在您自己的代码中,最好使用 stdbool.h 和 booltruefalse。但是你仍然应该避免显式测试,因为它是不必要的。

不过,我会避免隐式转换为 bool。因此,例如非空指针测试应该是 if( ptr != NULL) 而不是常见的习惯用法 if( ptr )。 “规则”是条件表达式应该是明确的布尔值。在您的情况下,如果 var 是布尔值,则无需测试是否与真/假相等。相反,如果 varnot 布尔值,那么您应该使用布尔表达式 0 == var/0 != var 进行测试。

建议主要是关于代码质量、健壮性、清晰度和可维护性。我怀疑它不会对任何合理的编译器中的代码生成产生任何影响。