首页  >  文章  >  后端开发  >  为什么在 C 中打印函数指针而不调用会产生“1”?

为什么在 C 中打印函数指针而不调用会产生“1”?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-25 07:37:29139浏览

Why Does Printing a Function Pointer Without Invocation Yield

在没有调用的情况下打印函数指针:理解 1 的神秘输出

在一个有趣的代码片段中,一个函数被“调用”而没有调用调用其括号 ("pr;"),然后使用 std::cout 打印。令人惊讶的是,结果始终为 1,违背了预期。

常数 1 之谜

代码以三种不同的方式调用函数 pr:

<code class="cpp">cout << pr;  // output: 1
cout << *pr; // output: 1
cout << &pr; // output: 1

直觉表明应该打印函数指针而不是神秘的 1。然而,理解这种行为需要更深入地研究 C 的类型转换机制。

类型转换和 Bool 值

当作为参数传递给 cout 时,pr 是隐式的转换为布尔值。发生这种转换是因为 bool 是基本类型,而 cout 需要基本类型作为输入。在 C 中,如果原始值非零,则转换后的 bool 值为 true;如果原始值为零,则转换为 false。

由于 pr 是函数指针,因此它的值是非零内存地址。因此,当转换为 bool 时,它的计算结果为 true,cout 输出为 1。

自定义函数指针打印(C 11 及以上)

C 11 引入一个可自定义的重载,允许打印更多信息的函数指针:

<code class="cpp">template <class RType, class ... ArgTypes>
std::ostream & operator<<(std::ostream & s, RType(*func)(ArgTypes...))
{
    return s << "(func_ptr=" << (void*)func << ")(num_args=" << sizeof...(ArgTypes) << ")";
}</code>

此重载打印函数指针的地址及其所采用的参数数量。它可以用于打印 pr,如下所示:

<code class="cpp">cout << pr; // output: (func_ptr=0x12345678)(num_args=0)</code>

这种方法提供了更具描述性的输出,使得更容易理解函数指针的属性。

以上是为什么在 C 中打印函数指针而不调用会产生“1”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn