Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么是c++;函数总是真的吗?_C++_Gcc_Function Pointers - Fatal编程技术网

C++ 为什么是c++;函数总是真的吗?

C++ 为什么是c++;函数总是真的吗?,c++,gcc,function-pointers,C++,Gcc,Function Pointers,那么为什么呢, #include <iostream> using namespace std; int afunction () {return 0;}; int anotherfunction () {return 0;}; int main () { cout << &afunction << endl; } #包括 使用名称空间std; int函数(){return 0;}; int另一个函数(){return 0;}; in

那么为什么呢,

#include <iostream>

using namespace std;

int afunction () {return 0;};

int anotherfunction () {return 0;};

int main ()
{
    cout << &afunction << endl;
}
#包括
使用名称空间std;
int函数(){return 0;};
int另一个函数(){return 0;};
int main()
{

CUT< P> C++中的所有地址都是非零,因为0是空指针,是一个保留值。任何非零值都被认为是真的。

< P>你检查了代码>另一个函数()/<代码>?< / P> 无论如何,C++指针地址,如C指针地址,通常在大多数平台上是虚拟的,并且不直接对应于内存位置,因此值可能非常小或不寻常。
此外,它们将始终为真,因为
0
NULL
,指针无效,任何超过0的值都为真

函数地址不是“真”。对于接受任意函数指针的ostream,没有重载。但是对于boolean,有重载,并且函数指针可以隐式转换为bool。因此编译器将
a函数
从其实际值转换为
true
false
。因为地址处不能有函数ode>0
,打印的值总是
true
,而
cout
显示为
1


这说明了为什么隐式转换通常是不受欢迎的。如果到
bool
的转换是显式的,那么您将有一个编译错误,而不是默默地做错误的事情。

函数指针类型不受
std::ostream
开箱即用的支持。您的指针将仅转换为可能的compatible类型-
bool
-由于与C的向后兼容性,所有不为零的东西都是
true

没有
操作符的重载iostream的函数指针不能重载没有重载的函数:
操作符或怀疑流操作符的解释错误。尝试(void*)&一个函数,可能前面有一个十六进制操纵器。
(void*)&一个函数
可以工作!你不需要操纵器。+1,就像我说的,但更快。“接受函数指针的ostream没有重载”。至少,没有一个函数可以接受每个函数指针。有三个(模板)对于流操纵器,它接受特定类型的函数指针,但它们无论如何都不会打印地址。我认为所有指针的
类型
都是数字。我会问为什么它们不是,但我明白这是一个完全不同的SO问题。谢谢@Steve jessop和@Dennis Zickefoose。@code shogan:函数指针和对象指针都是数字不一样(因为函数不是对象)。有一个
operator@Steve我的第一个错误是假设一切都是一个对象,因为C++是OO。有点像语言*吃它自己的狗粮。例如,在Python中,所有东西都是一个对象。不涉及为什么值总是1(而不是0x400 110或其他东西)。。不涉及为什么值总是1(而不是0x400110或其他)@cHao,我认为我不需要解释这一点;从问题标题判断,我假设提问者知道True等于1。仅从标题来看,你是对的。但实际问题的第2部分表明,预期的几乎肯定不是
True
或1,而是函数的地址。混淆不在于值是的,克里斯蒂安·劳(Christian Rau)指出了这一点。也许这是我在Python方面的背景,但我假设指针共享一种类型(又称继承)现在我在C++中思考,比如指针是类型。@代码指针指向对象,共享一个继承。任何指针指向一个对象都可以转换为<代码> Value*/COD>。指针指向函数不可转换为<代码> VUT*<代码>。@ Rob AHA,现在我得到上面的例子是如何工作的:我们不是在转换指针,而是实际上只是而是创建一个空指针。这一切最终都是有意义的+1@code请注意,<代码>(Value&)和Func < /C>是GCC扩展。C++标准不能保证这会起作用。
cout << (void *) afunction << endl;
0x401344
cout << (void*)&afunction << endl;