下面程序的结果是多少?
[C++] 纯文本查看 复制代码 #include <iostream>
using namespace std;
int main()
{
float a = 1.0f;
cout << (int)a << endl;
cout << &a << endl;
cout << (int &)a << endl;
cout << boolalpha << ( (int)a == (int &)a ) << endl;
float b = 0.0f;
cout << (int)b << endl;
cout << &b << endl;
cout << (int &)b << endl;
cout << boolalpha << ( (int)b == (int &)b ) << endl;
return 0;
}
运行输出:1
0xbfeb3c4c
1065353216
false
0
0xbfeb3c48
0
true 这里面需要特别注意的一个地方是 (int &)a 。首先这里要确定的是输出的是 a 的地址还是 a 的值,如果是 a 的值,那么该值又是多少?可以单独观察 cout << (int &)a << endl; 这条语句的反汇编代码:
[Plain Text] 纯文本查看 复制代码
movl $0x3f800000, %eax
movl %eax, 28(%esp)
leal 28(%esp), %eax
movl (%eax), %eax
movl %eax, 4(%esp)
movl $_ZSt4cout, (%esp)
上面,0x3f800000 正是浮点数 1.0 的表示方法。汇编代码里,先将 0x3f800000 这个数放入栈中,然后取得其存放的地址( leal 28(%esp), %eax),接着再次取出改值,然后传递到 cout 函数中。由此可见,(int &)a 表示的还是 a 的值,只不过在这里它强制将 a 的地址表示为整型地址,所以输出来的结果也就有所不同,1065353216 这个树就是 0x3f800000 的十进制形式。 |