GESP 四级 · GESP 202309 C++ 四级 第 14 题

选择题 · 答案 D

← 整套速查表 GESP 四级 全部真题

题目

执行以下 C++ 语言程序后,输出结果是( )。

#include <iostream>
using namespace std;

int main() {
    int fib[10];
    fib[0] = 0;
    fib[1] = 1;
    for (int i = 2; i < 10; i++)
        fib[i] = fib[i - 1] + fib[i - 2];
    cout << fib[10] << endl;
    return 0;
}
答案:D

解题思维

这题表面考斐波那契递推,实则考数组下标边界。拿到题先看数组声明 int fib[10],有效下标是 0 到 9,最后 cout << fib[10] 直接越界了,这是未定义行为,所以答案只能选 D。

常见错误

学生最容易掉进 C 选项的陷阱,看到前面循环算到了 fib[9]=55,就下意识认为 fib[10] 也是 55 或者程序能正常输出。还有人会选 A 或 B,把下标和值搞混,或者只记住了 fib[5]=5。根本问题是不敢确认数组声明和访问下标的关系,觉得编译器不会报错就以为能跑,其实 C++ 里越界访问是未定义行为,结果完全不可预测。

详细解析(节选)

考点与命题视角

这道题考查的是数组的声明与访问边界、循环的执行逻辑以及未定义行为的概念。命题人很狡猾,用经典的斐波那契递推做外衣,循环部分完全正确,计算过程也符合预期,但最后输出时偏偏访问了 fib[10]。四级大纲明确要求掌握数组下标从 0 开始,int fib[10] 的有效下标是 0~9,fib[10] 是越界访问。这类题的通用判断:先确认数组声明是否覆盖访问下标,再确认循环是否真的填满了该下标。

解题思维与推演

先填 0~9:循环 i=2..9 正确生成 fib[2]..fib[9](55 恰是 fib[9])。但最后 cout << fib[10] 直接访问第 11 个元素,数组只分配了 10 个 int。C++ 标准规定越界访问行为未定义,可能返回随机值、程序崩溃或看似正常。

如果改成 cout << fib[9] 答案就是 55,把 fib[10] 换成 fib[100] 则程序编译通过但运行结果随机。这类题的通用判断:先确认数组声明是否覆盖访问下标,再确认循环是否真的填满了该下标。刷到'数组 + 循环 + 输出'题,第一反应是'下标会不会越界'。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断