奇怪的TRUE和FALSE宏的定义

我在一本编码书中看到了以下宏定义。

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

那里没有解释。

请向我解释这些将如何工作为TRUEFALSE


让我们看看: '/' / '/'是指char字面量/除以char字面量'/'本身。 结果是一个,这对TRUE听起来是合理的。

'-' - '-'表示char '-' ,从自身中减去。 这是零( FALSE )。

这有两个问题:首先,它不可读。 使用10绝对更好。 另外,正如TartanLlama和KerrekSB指出的那样,如果您打算使用该定义,请在它们周围添加括号,这样您就不会有任何意外:

#include <stdio.h>

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

int main() {
        printf ("%dn", 2 * FALSE);
        return 0;
}

这将打印char '-' (在我的系统上是45)。

括号:

#define TRUE  ('/'/'/')
#define FALSE ('-'-'-')

程序可以正确打印0,尽管将真值与整数相乘并没有多大意义,但这只是一个例子,如果不将括号括起来,可能会引起一些意外的错误。


这只是另一种写作方式

#define TRUE 1
#define FALSE 0

表达'/'/'/'将分的炭值'/'本身,这将给1作为结果。

表达式'-'-'-'将从自身中减去'-'的char值,结果为0。

尽管整个define表达式都会丢失括号,这会导致代码中使用这些宏的错误。 周杰伦的回答非常好。

“忘记括号”的“真实生活”场景的一个例子是将这些宏与C风格的演员操作符结合使用。 如果有人决定在C ++中将这些表达式转换为bool ,例如:

#include <iostream>

#define TRUE  '/'/'/'
#define FALSE '-'-'-'

int main() {
    std::cout << "True: " << (bool) TRUE << std::endl;
    std::cout << "False: " << (bool) FALSE << std::endl;
    return 0;
}

以下是我们得到的结果:

True: 0
False: -44

所以(bool) TRUE实际上会评估为false ,并且(bool) FALSE评估为true


这相当于写作

#define TRUE 1
#define FALSE 0

'/'/'/'这个表达式实际上做的是将字符/ (不管它的数值是什么)除以它自己,所以它变成1

类似地,表达'-'-'-'中减去字符-从本身和的计算结果为0

写作会更好

#define TRUE ('/'/'/')
#define FALSE ('-'-'-')

以避免与其他更高优先级的操作符一起使用时意外更改值。

链接地址: http://www.djcxy.com/p/21151.html

上一篇: Strange definitions of TRUE and FALSE macros

下一篇: Return value of sizeof() in c?