Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C中定义值时,编译器如何选择数据类型_C++_C_Types - Fatal编程技术网

C++ 在C中定义值时,编译器如何选择数据类型

C++ 在C中定义值时,编译器如何选择数据类型,c++,c,types,C++,C,Types,只是一个关于编程的一般性问题:当你用C(或我想的任何语言)定义一个值时,编译器如何知道如何处理这个值?例如: #define CountCycle 100000 我假设CountCycle是一个“长整数”数据类型,但这只是一个假设。我想它也可能是一个float,一个double(不是int,因为它在~32k的最大值)等等 编译器如何选择#define值的数据类型?我没有申请这个问题的答案;我只是好奇。编译器不会做这样的事情。预处理器将100000替换为CountCycle 一旦替换完成,编译

只是一个关于编程的一般性问题:当你用C(或我想的任何语言)定义一个值时,编译器如何知道如何处理这个值?例如:

#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程序成为可执行程序分为四个阶段:

  • 预处理
  • 汇编
  • 装配
  • 连接
  • “预处理”是第一阶段

    #define是一个预处理器,在编译之前进行处理。 使用#define指令创建宏#define后面是宏的名称,然后是它应该是其缩写的标记序列,它被称为宏的主体、扩展或替换列表

    比如说-

    如果在程序中指定以下内容

    #定义缓冲区大小1000

    在将宏名称BUFFER_SIZE交给编译器之前,预处理器将在源代码文件中用宏扩展1000替换宏名称BUFFER_SIZE

    编译器不会做这样的事情。预处理器将100000替换为CountCycle

    这是真的,但是您必须关心一些截断定义值的编译器选项。例如,如果您使用的嵌入式平台窗体在运行时无法进行浮点计算,编译器可能会隐式地将您的浮点定义转换为整数定义。 不管怎样,你可以在编译时间内完成平点运算。为什么?因为许多参数可以通过执行此计算来提高最终结果的精度,并且可以使用在运行时截断的最终结果

    所以,正确使用它的方法是在你所用的地方注意:在一个不动点的数学中;作为浮动数据;或者别的什么。防止错误的一个好方法是通过执行以下操作显式转换任何数字:

    #定义我的浮点数据(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++编译器,任何与标准的偏差都会被记录下来,你也会相应地进行编程。