const vs #define(奇怪的行为)

时间:2016-01-17 10:38:05

标签: c++ const

我曾经用#define替换const,但在下面的示例中,它打印 false

#include <iostream>
#define x 3e+38

using namespace std;

int main() {
    float p = x;
    if (p==x)
        cout<<"true"<<endl;
    else
        cout<<"false"<<endl;
return 0;
}

但如果我更换

#define x 3e+38

const float x = 3e+38;

它完美无缺,问题是为什么? (我知道有几个主题讨论#define vs const,但是真的没有得到这个,请赐教我)

2 个答案:

答案 0 :(得分:5)

在c ++中,文字是双精度的。在第一个例子中,数字3e + 38首先在变量初始化中转换为float,然后在比较中返回双精度。转换不是必需的,因此数字可能不同。在第二个示例中,数字始终保持浮动状态。要解决此问题,您可以将p更改为double,然后写入

#define x 3e+38f

(定义浮点文字),或将比较更改为

if (p == static_cast<float>(x))

执行与变量初始化相同的转换,然后以单精度进行比较。

同样评论浮点数与==的比较通常不是一个好主意,因为舍入错误会产生意外结果,例如,x*y可能与y*x不同。 / p>

答案 1 :(得分:1)

3e + 38的数量因其幅度而翻倍。

作业

float p = x; 

导致3e + 38在p存储时失去其精度,因此失去其值。

这就是比较的原因:

if(p==x)

导致错误,因为p的值不同于3e + 38。