我在一本编程书中看到了以下宏定义。
#define TRUE '/'/'/'
#define FALSE '-'-'-'
那里没有解释。
请向我解释这些如何作为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 ("%d\n", 2 * FALSE);
return 0;
}
这将打印出 '-'
这个字符字面值的值(在我的系统上为 45)。
加上括号:
#define TRUE ('/'/'/')
#define FALSE ('-'-'-')
即使将一个真值与整数相乘并没有太多意义,但该程序正确地打印了零。这只是一种未经括号化的宏可能会咬你的类型的意外错误的示例。
notx = TRUE - x;
并且可以正常工作。但是,TRUE-FALSE
的结果是-44(假设使用ASCII编码)。 - Hagen von Eitzenstatic const bool TRUE = true;
。(尽管此定义实际上具有int
类型而不是bool
。) - Peter Cordes这只是另一种书写方式。
#define TRUE 1
#define FALSE 0
表达式'/'/'/'
将把'/'
的字符值除以它本身,其结果将为1。'-'-'-'
将从'-'
的字符值中减去它本身,其结果将为0。define
表达式周围缺少括号,这可能导致使用这些宏的代码出错。Jay's answer很好地解决了这个问题。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 ('-'-'-')
为了避免在与其他优先级更高的运算符一起使用时发生意外值的变化。Jay已经回答了为什么这些表达式的值是0
和1
。
出于历史原因,这些表达式'/'/'/'
和'-'-'-'
来自1984年第一届国际混淆C代码大赛的一个条目。
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
(链接到程序这里,在上面的IOCCC页面中有关于这个程序做什么的提示。)
此外,如果我没记错的话,这些表达式作为混淆的宏定义了TRUE
和FALSE
,并且在Don Libes(1993年)的"Obfuscated C and Other Mysteries"一书中也有涉及。
这是一种写宏的滑稽方式,针对True
和False
。
许多解释已经提供了,其中/
表示一个1字节数字(根据ASCII),当被自己除时,它会给你1
,这将被视为True
;同样,-
再次是一个字节数字,当减去相同的值时,它会给你0
,这将被解释为false
。
#define TRUE '/'/'/'
#define FALSE '-'-'-'
/
或-
替换为任何我们喜欢的字符,例如:#define TRUE '!'/'!'
#define FALSE 'o'-'o'
将保持与原始表达相同的含义。
'/' / '/'
,表示“字符'/'除以字符'/'”。由于在C语言中,每个字符都是一个数值(一个字节),因此可以将其视为“字符'/'的ASCII值除以相同字符的ASCII值”,这意味着1(因为很明显,x/x等于1)。因此,TRUE
是1。FALSE
,原理相同:'-'-'-'
读作'-' - '-'
,即“'-'的ASCII值减去'-'的ASCII值”,结果是0。因此,FALSE
是0。'/'/'/'
对于任何有效的字符集都是1,无论'/' == 47
(如ASCII中一样)还是'/' == 97
(如EBCDIC中一样)或其他任何值。 - Keith Thompson'/'
映射为 0
。这个值为null字符保留。 - Keith Thompson