我不小心打印了一个没有括号的函数名称,并打印了一个值。我只是好奇这是怎么发生的? 无论函数名称或定义如何,输出都是相同的,并且每次运行时都是如此。
编辑:答案让我怀疑,对于正在读这篇文章的其他人 - 将函数名显式转换为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;
}
答案 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
的函数指针的值。