const是在编译时双重演绎吗?

时间:2012-02-02 15:51:36

标签: c++ casting floating-point

将数学常量定义为double值是有意义的,但是当需要浮点值而不是双精度值时会发生什么?编译器是否在编译时自动将双精度解释为浮点数(因此它们实际上被视为const浮点数)或者是在运行时进行的转换?

1 个答案:

答案 0 :(得分:2)

如果通过“定义”,您的意思是使用#define,则会发生以下情况:

说你有:

#define CONST1 1.5
#define CONST2 1.12312455431461363145134614  // Assume some number too
                                             // precise for float

现在,如果你有:

float x = CONST1;
float y = CONST2;

您没有收到x的任何警告,因为编译器自动使CONST1成为float。对于y,您会收到警告,因为CONST2不适合float,编译器无论如何都会将其转换为float。< / p>


如果通过“定义”,您的意思是使用const变量,那么会发生以下情况:

说你有

const double CONST1=1.5;
const double CONST2=1.12312455431461363145134614; // Assume some number too
                                                  // precise for float

现在,如果你有:

float x = CONST1;
float y = CONST2;

编译器无法知道CONST1CONST2(*)的值,因此在编译它们时无法将值解释为float。您将收到两条关于可能丢失数据的警告,转换将在运行时完成。

(*)其实有一种方法。由于值为const,优化器可能决定不为它们采用变量,而是替换整个代码中的值。这可能会变得复杂,因为您可以将地址传递给这些变量,因此优化器可能决定不这样做。也就是说,不要指望它。


请注意,对于任何基本类型转换,这一切都是正确的。如果你有

#define CONST3 1

然后你认为CONST3int,但如果你把它放在float中,它会在编译时成为float,或者如果你把它放入char,在编译时会变为char