问题描述
我修改了一些芯片制造商的示例代码以删除一堆我认为愚蠢的布尔比较,例如:
-
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 有一条指令以寄存器中的单个位、JB
和 JNB
为条件进行跳转。如果您的编译器知道要检查哪个位,它可以使用它。
或者,您可以检查累加器中的值是否为 0、JZ
、JNZ
。但要使其工作,您可能需要先将值放在累加器上,这可能需要清除并移动到该值,从而增加开销。
如果您的编译器不是非常老派,请使用内置但不是很标准的 _Bool
或类似的“伪类型”,您的编译器将像它可以(并且可能做你想做的事)。
这不仅没有必要,而且是个坏主意。只有与 FALSE 进行比较是安全的,因为任何非零值都隐式为 true
,但将此类值与 TRUE
进行比较可能会失败。
你做对了。虽然您可能需要考虑维护。如果供应商更新此代码,您可能必须重新应用所有更改。通常,按原样使用第三方代码会更简单;没有这样的代码会符合您特定的本地编码标准或风格 - 可能不仅仅是这样。忍受或不使用它;当然不要复制它。
在您自己的代码中,最好使用 stdbool.h 和 bool
、true
和 false
。但是你仍然应该避免显式测试,因为它是不必要的。
不过,我会避免隐式转换为 bool
。因此,例如非空指针测试应该是 if( ptr != NULL)
而不是常见的习惯用法 if( ptr )
。 “规则”是条件表达式应该是明确的布尔值。在您的情况下,如果 var
是布尔值,则无需测试是否与真/假相等。相反,如果 var
是 not 布尔值,那么您应该使用布尔表达式 0 == var
/0 != var
进行测试。
建议主要是关于代码质量、健壮性、清晰度和可维护性。我怀疑它不会对任何合理的编译器中的代码生成产生任何影响。