为什么打印函数名返回一个值?
Why does printing a function name returns a value?
我不小心打印了一个没有括号的函数名,它打印了一个值。我只是好奇这是怎么发生的?无论函数名或定义如何,输出都是相同的,并且每次运行它。
编辑:这些答案澄清了我的疑问,给任何正在阅读这篇文章的人显式地将函数名转换为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
的函数指针的值。
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 如何使用gdb制作一个可以漂亮地打印每个对象的C++函数
- 获取用C/C++打印的最后一个字符串
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 只有一个内环的打印图案
- 将值传递到另一个类函数在打印时为零
- 我用字符串做了一个C++构造函数,但它不会打印出字符串
- 我重载了 << 和 = 运算符。为什么当我将一个对象分配给另一个对象并尝试打印它时,我会被打印出来?
- 打印对象的映射,其中另一个对象作为键
- 类函数返回到另一个类函数返回打印不同的值
- 如何打印下一个字母直到 Z 并继续到 A?
- 我在 C++ 中创建了一个函数来递归反转字符串,但是之后如何使功能打印一个 endl?
- c++:如何打印出一个强制转换的 int 值?
- 为什么在C++中增加指针后打印了一个值而不是 NULL/0?
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- 该程序没有产生输出,而是卡在一个循环中,几秒钟后消失并打印被杀死?
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 如何在级别上打印树,给定一个结构,该结构保存节点的值及其父节点的值,对于树中的每个节点
- 需要使班级(long_number)用构造函数和一个打印功能代表1到60的任何长度