C++ 为什么打印函数名会返回一个值?
我无意中打印了一个没有括号的函数名,它打印了一个值。我只是好奇这是怎么发生的? 无论函数名或定义如何,每次运行它时,输出都是相同的 编辑:这些答案消除了我的疑虑,对任何阅读本文的人来说- 将函数名显式转换为int有效, i、 e int k=(int)foo 此测试代码将使事情更加清楚:C++ 为什么打印函数名会返回一个值?,c++,C++,我无意中打印了一个没有括号的函数名,它打印了一个值。我只是好奇这是怎么发生的? 无论函数名或定义如何,每次运行它时,输出都是相同的 编辑:这些答案消除了我的疑虑,对任何阅读本文的人来说- 将函数名显式转换为int有效, i、 e int k=(int)foo 此测试代码将使事情更加清楚: #include <iostream> #include <stdio.h> #include <conio.h> using namespace std; void fo
#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;
}
#包括
#包括
#包括
使用名称空间std;
void foo(){cout此语句printf(“\n%u”,foo);
传递函数foo()的地址
到printf
。因此,打印的值是正在运行的程序内存中该函数的地址。提到不带括号的函数名会被解释为函数指针。%u
格式说明符会将指针解释为无符号int
,该说明符未定义但viour恰好在大多数系统上都能工作
int k=foo
不起作用的原因是函数指针通常需要转换为int
。然而,printf
要宽松得多,因为它使用varargs
解析其参数字符串;参数的类型假定与格式字符串中请求的类型匹配
std::cout << foo;
使用printf(“\n%u”,foo);
,%u
期望无符号int
,您看到的是转换为无符号int
的函数指针的值。为什么要混合cout
和printf
printf
不是类型安全的。仅仅因为printf
可以做一些事情,并不意味着它应该做。“不带括号的函数名被解释为函数指针。”稍微不精确,至少在C++中。例如,“代码>空洞(和PF)()= FoO;”指针被%u格式说明符转换为未签名int。“实际上,它将是未定义行为,不是吗?
std::cout << reinterpret_cast<void*>(foo) << std::endl;