计算一个不调用的函数:解开谜团
想象一下:你正在编码,而不是调用带括号的函数,您只需打印它的名称即可。令人惊讶的是,结果总是 1。这种非常规的方法让您感到困惑,无论是关于 1 还是缺少预期的函数指针。
让我们深入研究代码的复杂性:
<code class="c++">#include <iostream> using namespace std; void pr() { cout << "sth"; } int main() { pr; cout << pr; // output: 1 cout << *pr; // output: 1 cout << ≺ // output: 1 }
与您的意图相反,您实际上并没有在 cout<< 中调用函数 pr声明。相反,您将其函数指针传递给 cout。这会导致 pr 隐式转换为布尔值,从而导致输出中普遍存在 1。
为了增强您的理解,请考虑使用 cout <<打印前的布尔阿尔法。这将显示 true 而不是 1,从而增强了输出的布尔性质。
虽然 C 11 提供了一个优雅的解决方案:
<code class="c++">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>
此重载允许您打印任意数量的函数指针,显示函数指针的地址及其参数数量等信息。
所以,你已经知道了:神秘的 1 不仅仅是巧合,而是隐式类型转换的结果。理解这种行为对于避免意外结果和编写更健壮的代码至关重要。
以上是为什么在 C 中打印函数名称会导致'1”?的详细内容。更多信息请关注PHP中文网其他相关文章!