在没有调用的情况下打印函数指针:理解 1 的神秘输出
在一个有趣的代码片段中,一个函数被“调用”而没有调用调用其括号 ("pr;"),然后使用 std::cout 打印。令人惊讶的是,结果始终为 1,违背了预期。
常数 1 之谜
代码以三种不同的方式调用函数 pr:
cout 直觉表明应该打印函数指针而不是神秘的 1。然而,理解这种行为需要更深入地研究 C 的类型转换机制。
类型转换和 Bool 值
当作为参数传递给 cout 时, pr 是隐式的转换为布尔值。发生这种转换是因为 bool 是基本类型,而 cout 需要基本类型作为输入。在 C 中,如果原始值非零,则转换后的 bool 值为 true;如果原始值为零,则转换为 false。
由于 pr 是函数指针,因此其值是非零内存地址。因此,当转换为 bool 时,其计算结果为 true,cout 将其输出为 1。
自定义函数指针打印(C 11 及以上)
C 11 引入可自定义的重载,允许打印更多信息的函数指针:
template
std::ostream & operator此重载打印函数指针的地址及其所采用的参数数量。它可以用来打印 pr,如下所示:
cout 这种方法提供了更具描述性的输出,使得更容易理解函数指针的属性。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3