下面 C++ 代码执行后输出是( )。
int foo(float *f)
{
return int(*f * 2);
}
int main()
{
float fnum[10] = {1.1};
fnum[1] = foo(fnum);
cout << fnum[0] + fnum[1] << endl;
cout << endl;
return 0;
}这题核心在追踪数组名作为指针传参后的取值与写回位置。fnum 传给 foo 时丢失下标信息,函数内只能取首元素;返回值强转为 int 截断小数,再赋给 fnum[1]。最后浮点加法输出默认一位小数,直接算出 3.1 即可。
最容易错在把 fnum 当成整体传进去,以为函数能访问数组其他元素,或者误以为指针传参会保留下标。还有很多人忽略了 int(*f * 2) 的强转,把 2.2 当成 2.2 参与加法,得到 3.3 选错。另外 cout 输出浮点数默认格式是保留一位小数,3.1 本身就是精确值,不会显示 3 或 3.10,这点常被忽略导致误选整数选项。
【考点】指针与数组|隐式类型转换|cout 输出浮点数
GESP 四级 C++ 大纲"指针与数组"模块典型综合题。命题人卡住的是"数组名传指针时首地址相同但下标偏移"这个认知盲区,四级学生习惯把数组当整体看,却忘了 fnum 作为指针传进函数时本质上就是 fnum 的首地址,而 foo 返回的 int 要写回数组却是 fnum[1] 这个位置。
看到 main 里 fnum[1] = foo(fnum) 这行,先确认 foo 接收的是指针(fnum 本身即 fnum[0] 的地址),foo 里 *f 就是 fnum[0]。*f * 2 = 1.1 × 2 = 2.2,C++ 强转 int 截断小数得 2。因此 fnum[1] 被赋值为 2。fnum[0] + fnum[1] = 1.1 + 2 = 3.1。cout 输出浮点数会保留一位小数(3.1 本身就是精确值),所以选 D。
最阴险的是 cout 输出浮点数默认格式——3.1 恰好是一位小数,不会显示 3,也不显示 3.10,而是 3.1。如果你只背"cout 输出 int 是整数",看到 1.1 + 2 就会慌,容易选错。
如果 foo 改成返回 float(return (float)(*f * 2)),fnum[1] 就是 2.2,输出变 3.3;如果 foo 参数改成 float(float foo(float x)),那 fnum 传进去就自动退化,*x 变成 x[0] 的地址取不到,会编译错误;如果 fnum[1] 改成 fnum[2],输出仍是 3.1。刷到类似题先问自己:"指针传数组进去,函数里取的是哪个元素?返回值写回数组哪个下标?cout 这行会输出什么?"
本题含程序代码(阅读/完善程序),详细解析请控制在 1000-1800 字,讲清算法主线与逐空/逐问推演。