您正在混淆很多不同的东西:控制语句,运算符和布尔类型。每个都有自己的规则。
控制语句的工作方式类似于if
C11 6.4.8.1语句:
在这两种形式中,如果表达式比较不等于0,则执行第一个子语句。
while
,for
等等具有相同的规则。这与“ true”或“ false”无关。
对于应该产生布尔结果的运算符,它们实际上产生的int
值为1或0。例如,等于运算符C11 6.5.9:
如果指定的关系为true,则每个运算符的结果为1;如果为false,则为0。
上面所有这些都是因为C直到1999年才有了布尔类型,即使C确实得到了布尔类型,上述规则也没有改变。因此,与大多数其他编程语言(其中的语句和运算符产生布尔类型(例如C ++和Java))不同,它们只是产生一个int
,其值为零或非零。例如,sizeof(1==1)
在C中给出4,而在C ++中给出1。
C语言中的实际布尔类型已命名,_Bool
并且需要现代编译器。头stdbool.h
定义的宏bool
,true
并false
展开后_Bool
,1
并0
分别(用于C ++兼容性)。
但是,将控制语句和操作符视为实际需要/产生布尔类型被认为是良好的编程习惯。某些编码标准(例如MISRA-C)推荐这种做法。那是:
if(ptr == NULL)
代替if(ptr)
。
if((data & mask) != 0)
代替if(data & mask)
。
这种样式的目的是借助静态分析工具提高类型安全性,从而减少错误。可以说,只有当您使用静态分析器时,这种样式才有意义。尽管在某些情况下,它会导致更具可读性的自我记录代码,例如
if(c == '\0')
好的,目的很明确,代码是自我记录的。
与
if(c)
坏。可能有任何含义,我们必须去寻找c
能够理解代码的类型。它是整数,指针还是字符?