为什么会这样,
#include <iostream>
using namespace std;
int afunction () {return 0;};
int anotherfunction () {return 0;};
int main ()
{
cout << &afunction << endl;
}
给这个,
1
答案 0 :(得分:16)
函数地址不是“true”。接受任意函数指针的ostream没有重载。但是有一个布尔值,函数指针可以隐式转换为bool。因此编译器会将afunction
从其实际值转换为true
或false
。由于您在地址0
处无法使用此功能,因此打印的值始终为true
,cout
显示为1
。
这说明了为什么隐式转换通常不受欢迎。如果转换为bool
是明确的,那么您将遇到编译错误而不是默默地做错事。
答案 1 :(得分:3)
开箱即用的std::ostream
不支持函数指针类型。您的指针只会转换为可能的兼容类型 - bool
- 由于向后兼容C,因此非{0}的东西是true
。
答案 2 :(得分:2)
函数指针(流操作符除外)没有operator<<
的重载,但bool
有一个,所以函数指针在显示之前转换为该类型。
地址不相等,但它们都是非空的,因此它们都转换为true
。
答案 3 :(得分:1)
没有重载函数:operator<<(ostream&, int(*)())
,因此您的函数指针将转换为唯一有效的类型bool
。然后operator<<(ostream&, bool)
正在打印转换后的值:1。
您可以像这样打印功能地址:
cout << (void*)&afunction << endl;
答案 4 :(得分:0)
C ++中的所有地址都不为零,因为零是NULL指针并且是保留值。任何非零值都被视为真。
答案 5 :(得分:0)
iostream的函数指针不能重载&lt;&lt;运算符,因为有无数个可能的函数指针类型。因此,函数指针会应用转换,在本例中为bool。尝试:
cout << (void *) afunction << endl;
哪个会给你十六进制的地址 - 对我来说结果是:
0x401344
答案 6 :(得分:-1)
你也检查了anotherfunction()
吗?
无论如何,C ++指针地址,如C指针地址,通常在大多数平台上是虚拟的,并不直接对应于内存位置。因此,价值可能非常小或不寻常。
此外,它们将始终为真,因为0
为NULL
,指针无效,且任何超过0的内容都为真