为什么打印函数名返回一个值?

Why does printing a function name returns a value?

本文关键字:一个 打印 函数 返回 为什么      更新时间:2023-10-16

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

编辑:这些答案澄清了我的疑问,给任何正在阅读这篇文章的人显式地将函数名转换为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;
}

没有括号的函数名被解释为函数指针。该指针被%u格式说明符解释为unsigned int,这是一种未定义的行为,但在大多数系统上都有效。

int k = foo不工作的原因是函数指针通常需要强制转换为int。然而,printf要宽松得多,因为它使用varargs来解析它的参数字符串;参数的类型假定与格式字符串中请求的类型匹配。

语句printf("n%u", foo);将函数foo()的地址传递给printf。因此,输出的值是该函数在运行程序内存中的地址。

std::cout << foo;

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

要打印它的地址,需要显式转换:

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

对于printf("n%u", foo);, %u期望unsigned int,您看到的是转换为unsgigned int的函数指针的值。

相关文章: