奇怪的TRUE和FALSE宏的定义
我在一本编码书中看到了以下宏定义。
#define TRUE '/'/'/'
#define FALSE '-'-'-'
那里没有解释。
请向我解释这些将如何工作为TRUE
和FALSE
。
让我们看看: '/' / '/'
是指char
字面量/
除以char
字面量'/'
本身。 结果是一个,这对TRUE
听起来是合理的。
而'-' - '-'
表示char
'-'
,从自身中减去。 这是零( FALSE
)。
这有两个问题:首先,它不可读。 使用1
和0
绝对更好。 另外,正如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