【发布时间】:2015-09-28 14:54:33
【问题描述】:
当我用#define(例如#define pi 3.141593)定义一个数字常量时,它是int、float、double 还是什么?
【问题讨论】:
-
常数值作为双精度,而不是变量。
标签: c constants c-preprocessor
当我用#define(例如#define pi 3.141593)定义一个数字常量时,它是int、float、double 还是什么?
【问题讨论】:
标签: c constants c-preprocessor
两者都没有。它是按字典顺序替换的,也就是说,无论出现在哪里,它都会将 pi 替换为 3.141593。
【讨论】:
当您定义它时,它们都不是。
预处理器将在您的代码中查找 pi 并将其替换为 3.141593,然后再尝试实际编译代码。
根据Wikipedia:
只要标识符出现在源代码中,它就会被替换标记列表替换,该替换标记列表可以为空。
类型将由您使用该宏的上下文定义。
【讨论】:
预处理器对这个#define 宏所做的只是文本替换,它不知道pi 是什么类型。
这里pi的类型由3.141593决定,是double类型的字面量。
【讨论】:
经过预处理,宏 pi 将被替换为文字 3.141593,而浮点文字的类型为 double。如果您希望文字具有float 类型,则必须添加f 后缀——因此,文字3.141593f 将具有float 类型。
【讨论】:
#define 没有任何数据类型的概念。它简单地定义了预处理器的文本替换。
然后编译器将看到被替换的文本,并根据 C 标准给出的rules 确定常量的类型。
【讨论】: