撇开自从c99 stdbool.h
已经存在的事实,在定义处理布尔类型的宏时C
,以下是否有任何区别?
#define FALSE 0
#define TRUE 1 // Option 1
#define TRUE !FALSE // Option 2
Run Code Online (Sandbox Code Playgroud)
从这里的实例来看,它似乎没有什么区别.两种选择都有技术优势吗?(不包括第二个例子对c ++ bool
对象更好的事实.)
Sch*_*ern 11
ISO C和C99都这样定义!
.
逻辑否定运算符的结果!如果其操作数的值比较不等于0则为0;如果其操作数的值比较等于0则为1.结果的类型为int.表达式!E等价于(0 == E).
所以!0
评估为1
.给定符合标准的C编译器,您的选项将具有相同的结果.另外有没有运行时间延长,编译器会不断折叠!0
,以1
在编译时.
如果你想把它带到逻辑极端并且不做任何关于真或假的假设......
#define TRUE (1==1)
#define FALSE (!TRUE)
Run Code Online (Sandbox Code Playgroud)
无论语言如何,这都具有始终如一的优点.例如,在shell 0中通常被认为是"真"或"不是错误".
从C没有达成一致意见的标准来看,这种事情是不合时宜的.例如,Code Complete的第一版在第369页提倡这一点.当它在1993年发布时,你的C编译器很可能不符合ISO标准,并且stdbool.h不存在."代码完成"也适用于使用多种语言的多语言程序员.有些像shell和Lisp,以不同的方式定义真理.