const vs #define(奇怪的行为)

Mr.*_*.EU 5 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;
}
Run Code Online (Sandbox Code Playgroud)

但如果我更换

#define x 3e+38
Run Code Online (Sandbox Code Playgroud)

const float x = 3e+38;
Run Code Online (Sandbox Code Playgroud)

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

Ari*_*nen 5

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

#define x 3e+38f
Run Code Online (Sandbox Code Playgroud)

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

if (p == static_cast<float>(x))
Run Code Online (Sandbox Code Playgroud)

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

另外,作为评论,浮点数的比较==通常不是一个好主意,因为舍入误差会产生意外结果,例如,x*y可能与之不同y*x.