我有这段代码:
if ( ( data.is_err != FALSE ) && ( available != FALSE ) )
{
Set_Dtc_TimerChange(DTC_VPOS, +dt_ms);
}
为什么你会使用不等于假而不是等于真?有什么区别吗?
答案 0 :(得分:11)
这是一个C问题,而不是EE,但由于C非常接近硬件......
false的旧C定义为0,所有其他值为true ,即
if( 0 ){ ... }
不会执行...代码,但例如
if( 1 ){ ... }
if( -1 ){ ... }
if( 42 ){ ... }
一切都会。因此,您可以测试真值等于FALSE(定义为0),但是当您想要将其与true进行比较时,您将使用哪个值为true?有人说TRUE必须定义为(!FALSE),但这会产生-1,即 a 值为true,但不是唯一的。
因此程序员倾向于避免使用TRUE。
现代C应该通过将TRUE定义为(我认为)1来解决这个问题,但是stil会产生有趣的后果,比如
int probably( void ){ return 42; }
if( probably() ){ ... }
if( probably() == TRUE ){ ... }
这里的责任在于probbaly(),它会返回一个明确的真值。
就个人而言,我会写
if ( data.is_err && available ) { ... }
我认为它更具可读性并避免了比较。
(顺便说一句,如果出现数据错误,有什么可用的东西?)
答案 1 :(得分:8)
此代码可以安全地替换为:
if ( data.is_err && available ) {
Set_Dtc_TimerChange(DTC_VPOS, +dt_ms);
}
除非FALSE
在程序中的某处有一些非传统的定义。一个好的编译器会为这两种形式生成相同的代码,但更可读的更好。
答案 2 :(得分:1)
C没有布尔类型。相反,它将0视为false,将任何其他值视为true。因此,没有值可以测试以确定值是否为true。如果您编写惯用的C代码并不重要:if (x) ...
将始终做正确的事情。对这个成语感到不舒服的人喜欢明确地对某些虚假的表示进行测试,但从不解释为什么他们将这限制在一个级别。毕竟,x != FALSE
只是一个值,需要通过相同的参数进行测试:if ((x != FALSE) != FALSE)...
。