Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.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++ - Fatal编程技术网

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

C++ 为什么打印函数名会返回一个值?,c++,C++,我无意中打印了一个没有括号的函数名,它打印了一个值。我只是好奇这是怎么发生的? 无论函数名或定义如何,每次运行它时,输出都是相同的 编辑:这些答案消除了我的疑虑,对任何阅读本文的人来说- 将函数名显式转换为int有效, i、 e int k=(int)foo 此测试代码将使事情更加清楚: #include <iostream> #include <stdio.h> #include <conio.h> using namespace std; void fo

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

编辑:这些答案消除了我的疑虑,对任何阅读本文的人来说- 将函数名显式转换为int有效, i、 e 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;
}
#包括
#包括
#包括
使用名称空间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;