为什么打印函数名称会返回值?

时间:2015-08-02 11:12:31

标签: c++

我不小心打印了一个没有括号的函数名称,并打印了一个值。我只是好奇这是怎么发生的? 无论函数名称或定义如何,输出都是相同的,并且每次运行时都是如此。

编辑:答案让我怀疑,对于正在读这篇文章的其他人 -       将函数名显式转换为int作用,       即int k =(int)foo;

此测试代码将使事情更加清晰:

#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;

void foo(){cout<<'Á';}      //FUNCTION IS NEVER CALLED

int main()
{
    while(_kbhit())         //JUST TO MAKE SURE BUFFER IS CLEARED
    {   getch();}           //SAME RESULT WITHOUT THESE TWO STATEMENTS

    cout<<foo;              //OUTPUT 1
    printf("\n%u", foo);    //OUTPUT 4199232
    /*int k=foo;            //CANNOT CONVERT VOID(*)() TO 'INT'*/
    return 0;
}

3 个答案:

答案 0 :(得分:6)

提及没有括号的函数名称被解释为函数指针。 unsigned int格式说明符将指针解释为%u,这是未定义的行为,但恰好适用于大多数系统。

int k = foo无效的原因是函数指针通常需要转换为int。但是,printf更宽松,因为它使用varargs来解析其参数字符串;假定参数的类型与格式字符串中请求的类型匹配。

答案 1 :(得分:5)

此声明printf("\n%u", foo);将函数foo()的地址传递给printf。因此,打印的值是正在运行的程序的内存中此函数的地址。

答案 2 :(得分:3)

std::cout << foo;

输出1,因为foo是一个函数指针,它将bool转换为std::cout

要打印其地址,您需要明确地投射它:

std::cout << reinterpret_cast<void*>(foo) << std::endl;

使用printf("\n%u", foo);%u需要unsigned int,您看到的是转换为unsgigned int的函数指针的值。