请大家帮我看一下这两个c++程序题,万分感谢!

来源:百度知道 编辑:UC知道 时间:2024/06/30 06:46:39
第一个#include<iostream>
using namespace std;
void test(int a){}
void test(float a){}
void main()
{
test(1);
test('c');
/*test(0.5);*/
test(2+'c');
}
我的问题是为什么第三条语句不能通过编译?0.5不是能够精确匹配test(float a)吗?

第二个问题
#include<iostream>
using namespace std;
void main()
{
float a=1;
cout<<boolalpha<<((int)a==(int&)a);
float b=0;
cout<<boolalpha<<((int)b==(int&)b);
}
运行结果是fauseture ,我实在是不明白,希望大家能为我解释以下,呵呵,谢谢大家了

#include<iostream>
using namespace std;
void test(int a){}
void test(float a){}
int main()
{
cout<<sizeof(0.5)<<endl;
cout<<sizeof(float)<<endl;
test(1);
test('c');
//test(0.5);
test(2+'c');
return 0;
}
因为我们直接弄一个常量是小数的时候,它是按double型处理的。所以跟上面的不匹配,上面的程序可以程序0.5按什么类型处理。我运行的结果是
8
4
第二个问题
int&是引用类型,(int &)a的意思是将a存储单元开始的内容解释为一个int引用,同时使用type&可以少产生一个临时对象.
根据IEEE754的浮点数存储格式

1.0f 在内存中的存储为

0 011 1111 1 000 0000 0000 0000 0000 0000

亦即
0x3F800000 = (1065353216)10

在TC3.0下的结果是0的原因是: TC30下的int型是2个字节的, 所以读的是float类型的低两个字节内容为0.

在TC3.0下用(long &)将还是此结果

问题1.
是因为0.5是const double类型。如果把void test(float a){}
中的float改为double即可。

问题2.
(int&)a == static_cast<int&>(a)
(int&)a