在 C++ 语言中,长度为 $n$ 的数组,访问下标为 $n$ 的元素会引起编译错误。
这题考的是C++数组下标范围和编译期检查机制。拿到题先别急着选,要区分'越界是运行时错误'和'编译期报错'这两个概念,C++默认不做数组下标编译期检查,所以访问n是运行时未定义行为,绝不会在编译阶段报错。
最容易掉进'越界就是编译错误'的坑里,把C++当成Fortran或某些强类型语言,误以为编译器会拦截越界。其实C++里访问越界只是UB,编译器不管,程序照样能跑(通常崩溃或乱码),题干说'引起编译错误'绝对化了,这就是错选A的根本原因。
本题考查C++数组下标范围及编译期检查机制,核心是区分'越界是运行时错误'与'编译期报错'这两个不同阶段的行为。
长度为n的数组,合法下标是0到n-1,访问下标n必然越界。但C++的越界属于运行时未定义行为(UB),编译器不会在编译阶段拦截,所以题干说'会引起编译错误'是错的,答案选B。
命题人故意用'会引起编译错误'这种绝对化表述,诱导只背'下标从0开始'却不懂编译/运行期行为的考生误选A。C++不像Fortran那样在编译期检查数组下标,也不像某些语言提供静态越界检测,因此越界只能在运行时暴露,且不会报错,只会导致程序崩溃或输出乱码。
1. 看到'长度为n的数组访问下标n',立刻判断越界; 2. 问自己:C++越界是编译期还是运行期?答:运行期; 3. 问:运行期越界会报错吗?答:不会,是UB,程序可能跑也可能崩,但编译器不会报错; 4. 结论:题干说'会引起编译错误'错误,选B。
很多学生误以为C++会像Fortran那样在编译期检查数组下标,其实C++默认不做这种检查,只有C++17引入的bounds-checking模式(需要显式开启)才会在运行时检查,且也不是编译期报错。题干没提任何特殊模式,所以按默认行为判断。
复合类型在题库共考过146题,覆盖7个考试级别,逐年分布:2023年21题、2024年42题、2025年47题、2026年27题、null年9题;分赛事:GESP五级52题、GESP三级22题、GESP七级21题、GESP六级21题、GESP八级16题、GESP四级12题、CSP入门级2题。一维数组共考过224题,覆盖9个考试级别,逐年分布:2008年3题、2009年5题、2012年1题、2013年2题、2015年1题、2016年2题、2017年1题、2019年2题、2021年1题、2022年1题、2023年27题、2024年48题、2025年55题、2026年59题、null年16题;分赛事:GESP五级59题、GESP四级42题、GESP三级32题、GESP六级26题、GESP七级25题、GESP八级19题、NOIP提高组初赛10题、CSP入门级6题、NOIP普及组初赛5题。从数据看,一维数组在2024-2026年考频持续上升(48→55→59),复合类型在2025年达到峰值47题,说明数组相关概念仍是高频考点,且难度逐渐向边界行为(如越界、初始化、赋值)倾斜。
基于近年考频上升趋势及命题风格,未来GESP三级仍可能继续考查数组越界类型,但更倾向于结合运行时行为(如访问越界后程序输出)或与其他概念(如数组初始化、指针解引用)组合出题,单纯'编译期报错'这类绝对化表述的陷阱题概率会降低,因为考生已熟悉C++的UB特性。暂无足够依据预测具体题型变化,但建议重点复习数组默认行为与UB的区分。