NOT false和true之间的区别

时间:2015-09-11 15:08:40

标签: c

我有这段代码:

if ( ( data.is_err != FALSE ) && ( available != FALSE ) )
    {
        Set_Dtc_TimerChange(DTC_VPOS, +dt_ms);
    }

为什么你会使用不等于假而不是等于真?有什么区别吗?

3 个答案:

答案 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)...