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

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

没有任何解释.

请向我解释一下,TRUEFALSE是如何工作的.

推荐答案

让我们看一下:'/' / '/'表示char个文字/,除以char个文字'/'本身.结果是1,这听起来对TRUE来说是合理的.

'-' - '-'表示char'-',从其自身减go .这是零(FALSE).

这有两个问题:第一,它不可读.使用10绝对更好.此外,正如塔坦拉玛和凯勒克斯布所指出的,如果你打算使用这个定义,请在它们周围加上括号,这样你就不会有任何惊喜:

#include <stdio.h>

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

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

这将打印char个文字'-'的值(在我的系统上是45).

带括号的:

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

程序正确地打印零,尽管将真值乘以整数没有多大意义,但这只是一个例子,说明如果不将宏括起来,可能会出现意想不到的错误.

C++相关问答推荐

ARM上的Modulo Sim Aarch 64(NEON)

sizeof结果是否依赖于字符串的声明?

在C语言中使用scanf()时我无法理解的警告

在C中使用动态内存分配找到最小的负数

在struct中调用函数,但struct在void中 *

为什么GCC可以调用未定义的函数?

两个连续的语句是否按顺序排列?

在编译时参数化类型定义

每个 struct 变量在C中都有自己的命名空间吗?

struct -未知大小

在txt文件中找到指定的字符串,并从数字中减go 相同的值

接受任何参数的函数指针是否与接受不同参数的函数兼容

GCC奇怪的行为,有fork 和印花,有换行符和不换行符

Printf()在C中打印终止字符之后的字符,我该如何解决这个问题?

用C++构建和使用DLL的困惑

如何组合两个宏来初始化C语言中的字符串数组?

通过char*访问指针的对象表示是未定义的行为吗?

x86-64平台上的int_fast8_t大小与int_fast16_t大小

我正在使用 klib 库 我可以使用 (khash) KHASH_SET_INIT_INT64() 负值作为键.因为我在头文件中看到它使用 unsigned long int

macos/arm64 上地址空间不使用第一位吗?