我曾经用#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,但是真的没有得到这个,请赐教我)
在c ++中,文字是双精度的.在第一个例子中,数字3e + 38首先在变量初始化中转换为float,然后在比较中返回双精度.转换不是必需的,因此数字可能不同.在第二个示例中,数字始终保持浮动状态.为了解决这个问题,您可以更改p到double,写
#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.
| 归档时间: |
|
| 查看次数: |
104 次 |
| 最近记录: |