有关下面代码正确的是( )。
// 在C++语言中,可以通过函数指针的形式,将一个函数作为另一个函数的参数。
// 具体来说:bool checkNum(bool (*Fx)(int), int N); 声明了一个函数,
// 其第一个参数是函数指针类型,指向一个接收一个int参数且返回值为bool的函数。
#include <iostream>
using namespace std;
bool isEven(int N) {
return N % 2 == 0;
}
bool checkNum(bool (*Fx)(int), int N) {
return Fx(N);
}
int main() {
cout << checkNum(isEven, 10) << endl;
return 0;
}拿到题别慌,先盯着函数指针声明 bool(*Fx)(int) 看,它要的是个'吃int吐bool'的函数。再看isEven,签名分毫不差,直接传进去就能跑。最后别忘了cout输出bool时变1还是0这个细节,这才是定胜负的关键。
最大坑就在选项C,很多人以为cout<<true会输出'1',结果下意识选了D或者觉得代码有错。其实C++里bool转int就是1和0,true就是1。另外函数指针声明里括号的位置最容易看错,把bool(*Fx)(int)看成bool*Fx(int),以为是指针函数,其实那是另一码事。还有选项A和B,觉得传函数名会报错,其实函数名作为实参会自动转为地址,只要签名匹配就完全合法。
这道题出自GESP五级《C++程序设计》,核心考点就是函数指针以及函数作为参数传递(回调机制)。命题人特意选了五级,因为四级只要求会定义和调用函数,而五级明确要求掌握函数指针的声明与使用。这题看似简单,实则是区分四级与五级的硬门槛——很多考生卡在"只会调用函数、不懂传递函数"这一步。