C++ 在C中定义值时,编译器如何选择数据类型
只是一个关于编程的一般性问题:当你用C(或我想的任何语言)定义一个值时,编译器如何知道如何处理这个值?例如:C++ 在C中定义值时,编译器如何选择数据类型,c++,c,types,C++,C,Types,只是一个关于编程的一般性问题:当你用C(或我想的任何语言)定义一个值时,编译器如何知道如何处理这个值?例如: #define CountCycle 100000 我假设CountCycle是一个“长整数”数据类型,但这只是一个假设。我想它也可能是一个float,一个double(不是int,因为它在~32k的最大值)等等 编译器如何选择#define值的数据类型?我没有申请这个问题的答案;我只是好奇。编译器不会做这样的事情。预处理器将100000替换为CountCycle 一旦替换完成,编译
#define CountCycle 100000
我假设CountCycle
是一个“长整数”数据类型,但这只是一个假设。我想它也可能是一个float
,一个double
(不是int
,因为它在~32k的最大值)等等
编译器如何选择#define
值的数据类型?我没有申请这个问题的答案;我只是好奇。编译器不会做这样的事情。预处理器将100000
替换为CountCycle
一旦替换完成,编译器就可以接管100000
的类型为int
(如果可以在该范围内),如果不能,则为long
请参阅a和a。
CountCycle
没有类型。在程序中遇到此名称的任何地方,预处理器都可以将其替换为整数常量100000
类型为的是整数常量100000
如果整数十进制常量没有后缀,则(C标准,6.4.4.1整数常量)
5整型常量的类型是对应的
可以表示其值的列表
如果希望常量的类型为long int
,可以指定后缀。比如说
#define CountCycle 100000l
#define CountCycle 100000.0
如果常数的值在类型long int
的域中,则该常数将具有该类型。否则它将具有类型long-long-int
如果要指定浮动常量,应使用其表示形式之一。比如说
#define CountCycle 100000l
#define CountCycle 100000.0
C程序成为可执行程序分为四个阶段:
#定义我的浮点数据(FLOAT)4.55
#定义MY_INTEGER_DATA(int)4
编译器根本不关心#define
指令。这是预处理器的工作。预处理器对类型一无所知:它只做文本替换。define实际上是一个文本替换,所以在本例中它是一个整数文本。这个问题可能掩盖了一个误解。在#define
中,值没有类型,它只是一个标记。只有当你在“真实代码”中使用它时,它才是一种类型,而这将是与使用文字值相同的类型。即使在这种特殊情况下也不重要,请注意C和C++是两种非常不同的语言,标签通常不应该一起使用。语言在这一点上没有分歧。这难道不需要文字“L”吗?你是如何将15个字符转换成一个“否”的@RickAstley,它是U+034F组合的GRAPHEME-JOINER。@Diesel:请参阅我添加的两个参考资料。它告诉您整数文本的类型。请注意,2E500
,如果您的平台支持它,由于科学符号,它将是一个浮点文字。@RickAstley将了解如何将15个字符转换为“否”,而不是所有字符。例如,std::cout@MSalters无处不在。您的示例未显示预处理器名称。它被替换为整数常量100000
否,它被替换为非类型化标记,而不是整数常量。代入标记的位置决定了它是否被视为整数常量。@下划线\u d I更新了短语,如“它可以被代入…”我不确定是否同意这些说法。如果你的嵌入式平台不支持Flash(SIC)点数学,那么它不是C或C++编译器,任何与标准的偏差都会被记录下来,你也会相应地进行编程。