#define TRUE!FALSE vs #define TRUE 1

Fan*_*Fox 6 c

撇开自从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,以不同的方式定义真理.