C++中(long)someFunction转换输出结果及代码输出值原因解析
C++ 函数指针输出问题解答
先给出测试代码和运行结果:
#include <iostream> using namespace std; void someFunction() { cout << "someFunction" << endl; } int main() { cout << long(someFunction) << endl; cout << someFunction << endl; return 0; }
运行输出:
4196598 1
问题解答
1. (long)强制转换后的someFunction输出内容是什么?
输出的是someFunction函数的入口内存地址被转换为long类型后的十进制数值,示例中对应的数值就是4196598。
2. 两个输出值分别代表什么、来源是什么?
- 第一个输出值
4196598:是someFunction函数在当前进程虚拟地址空间中的入口地址,来源是代码显式将函数指针强转为long整数类型后,cout调用整数输出重载直接打印的数值。 - 第二个输出值
1:是布尔值true的默认十进制输出结果,来源是函数指针隐式转换为布尔类型后,cout调用布尔值输出重载打印的结果。
3. 代码输出该结果的原因是什么?
C++中直接使用函数名时,函数名会自动退化为指向函数入口地址的函数指针,两次输出的差异是cout的运算符重载匹配规则导致的:
- 执行
cout << long(someFunction) << endl;时,显式强制类型转换将函数指针转为long整数,编译器直接匹配到ostream& operator<<(long)重载,将地址对应的整数值以十进制输出,得到4196598。 - 执行
cout << someFunction << endl;时,C++标准库没有为普通函数指针提供对应的operator<<重载,编译器会寻找可行的隐式转换路径:非空的指针类型可以隐式转换为bool类型,非空指针转换结果为true,最终匹配到ostream& operator<<(bool)重载。默认配置下cout输出布尔值时会用1代表真、0代表假,因此输出1。
验证方式:在main函数开头添加
cout << boolalpha;开启布尔值字面量输出,第二个输出会变为true,可确认触发的是布尔值输出重载。
内容的提问来源于stack exchange,提问作者Chase W
相关产品推荐
相关产品推荐

