我最近玩的是函数指针,当我发现由std::cout
打印的函数指针的值总是计算为1时。
然而printf()
并非如此,它会打印出预期的结果。
如果有人能够解释这种行为背后的原因,那就太棒了。
以下是代码示例供参考。
#include<iostream>
using namespace std;
int fun(int a)
{
return 0;
}
int main()
{
cout<<(&fun)<<endl; //always prints 1
printf("%u",&fun); //this prints the expected result
return 0;
}
答案 0 :(得分:4)
printf
调用只是未定义的行为。函数指针不是无符号整数,因此为%u
参数提供它是无效的。 (尝试在64位平台上运行此代码。您将无法获得正确的函数指针值。)
另一方面,cout
是类型安全的。编译器看到一个函数指针参数,并尝试找到它可以的最佳打印函数(operator<<
重载)。函数指针本身没有这样的重载,并且指针不提供大量的隐式转换。只有一个重载可以工作,那就是bool
的重载。因此编译器将非NULL
函数指针转换为true
并传递它。然后重载将其打印为1
,但您可以使用std::boolalpha
修饰符将其打印为true
。
答案 1 :(得分:1)
您的cout
将(&fun)
视为布尔表达式,并警告它将始终评估为true
(即非零)。
尝试将其转换为void*
,因为地址应该打印,并检查会发生什么:
#include <iostream>
#include <stdio.h>
using namespace std;
int fun(int a){
return 0;
}
int main(){
cout<<(void*)(&fun)<<endl; //always prints 1
/* Side note: This will print the same as above */
// cout<<(void*)(fun)<<endl; // note the missing &
printf("%p",(void*)&fun); //this prints the expected result
// while(1);
return 0;
}
mu机器上输出:
0x401460
0x401460