下面 C++ 代码执行后的输出是()。
char ch[10]={'1'};
cout<<ch[2]<<endl;这题考的是数组初始化规则和 cout 的输出特性。别被 char 数组吓到,它本质上就是存了一堆字节,默认全是 0。拿到题先画个格子:10 个坑,只填了第 1 个,问第 3 个坑里是啥?再想 cout 遇到空字符(0)会干啥。
最容易掉进两个坑:一是把数组当成字符串,以为没填的部分是空格或者随机字符;二是看到答案 0 就选 A,忘了 cout 是按字符输出的,0 号字符看不见,所以屏幕上其实啥也没发生。还有人选 C 空格,那是 32,跟 0 差远了。
本题考查 GESP 三级大纲中数组初始化与字符输出的语义细节。命题人专门在此设坑,就是要区分 C 风格数组和 C++ string 的本质不同:数组是固定长度、未初始化部分默认为 0 的内存块,而 string 默认是空字符串。
拿到这种带数组初始化的题,脑子里先画个格子图。 1. 数组 char ch[10] 在栈上占 10 个字节,位置是 0 到 9。 2. 初始化列表 {'1'} 只填了第一个位置(下标 0),剩下的 9 个位置都没动。 3. C++ 规定,数组声明时未初始化的元素,默认全部置为 0。所以 ch[1] 到 ch[9] 全是字符 0(即空字符 \0)。 4. 题目问 ch[2],正好落在未初始化区域,值就是 0。 5. 再看输出:cout << ch[2] 会把整数 0 按字符输出,字符 0 在终端上不可见,但 endl 会正常换行。所以肉眼看到的是“空行”,也就是“什么也不输出”。
char ch[10]={'1'}; 内存布局:ch[0]='1', ch[1]='0', ch[2]='0', ..., ch[9]='0'。
cout << ch[2] << endl; ch[2] 的值是字符 0,输出时不显示任何可见字符;endl 输出换行符。最终效果:屏幕上只有一行空白。
ch[2] 的值确实是 0,就以为输出是数字 0。这是把“整数值”和“字符输出”混为一谈了。cout 默认按字符输出,0 号字符看不见。{'1'} 填的是下标 1,或者误以为数组下标从 1 开始。' '),而这里全是 0,命题人用这个选项诱使你把 0 当成空格。如果原题改成 char ch[10] = {'1', ' ', '0'}; cout << ch[2];,那 ch[2] 就是字符 '0',答案就会变成 A。若改成 string s = "1"; cout << s[2];,则触发越界访问,行为未定义(实际常为 \0 或随机值),考点就从“数组初始化”跳到“字符串越界”,难度直接升级。
数组初始化属于基础语法,题库共考过 1295 题,覆盖 11 个考试级别。逐年分布:2008 年 1 题、2011 年 1 题、2019 年 3 题、2023 年 287 题、2024 年 413 题、2025 年 401 题、2026 年 109 题、null 年 80 题。分赛事:GESP 一级 332 题、GESP 二级 283 题、GESP 三级 215 题、GESP 四级 186 题、GESP 七级 91 题、GESP 八级 79 题、GESP 六级 78 题、GESP 五级 23 题、CSP 提高级 3 题、CSP 入门级 3 题、NOIP 提高组 初赛 2 题。可见这类题在 GESP 三级中占比约 16.6%,是高频考点。
从数据看,2023-2025 年数组相关题目数量激增(287→413→401),说明命题组正在加大基础语法与内存语义的考查力度,尤其是“默认初始化”和“字符输出”这类容易被忽视的细节。未来 GESP 三级、四级甚至 CSP 入门级仍会持续出现类似陷阱题,可能会结合指针或结构体数组进一步考察内存布局。暂无足够依据预测具体年份的题型变化,但建议重点复习数组声明、初始化列表、默认值规则以及 cout 对不同类型(char、int、string)的输出行为差异。