下面 C++ 代码执行后不能输出"GESP"的是()。
别急着看代码,先圈出题目里那句致命的‘不能输出’。这题考的是字符串初始化语法的等价性,以及下标访问的‘零起始’规则。命题人把四个选项摆成两两对比:A、B、D全是构造整串,只有C是切片。拿到题先想:cout<<str是输全串,str[i]是从0开始数,那str[1]到str[4]到底取哪几个字符?
最容易栽跟头的就是C选项。很多同学背了‘string str("GESP")',看到C选项里的圆括号就以为和A一模一样,完全忽略了后面那串下标访问。更隐蔽的坑是下标越界:字符串"GESP"长度是4,下标合法范围是0~3。C选项却从str[1]开始,一直写到str[4],那个str[4]根本不存在,输出的是空字符\0。结果屏幕上只蹦出"ESP"加个不可见字符,绝没有"GESP"。另外,花括号初始化str{"GESP"}是C++11的新特性,但功能跟圆括号完全一致,别被新语法吓住。
【考点】字符串初始化语法|下标访问规则|cout输出行为
这道题属于GESP三级“字符串与输入输出”模块的核心内容,命题人专盯“构造语法等价性”和“下标越界”这两个盲区。解题要抓住三件事:一是三种构造写法(圆括号、默认值、花括号)均生成同样字符串;二是cout<<str直接输出整串;三是str[i]访问从0开始,长度4的字符串下标4已越界。
先看A、B、D三个选项。A用构造函数string str("GESP"),B用默认初始化后赋值string str="GESP",D用花括号初始化string str{"GESP"}。这三者在C++中都是合法的,且最终str的内容完全一致,都是"GESP"。cout<<str就会把整个字符串打印出来,所以这三个都能输出"GESP",直接排除。
再看C选项:string str("GESP"); cout<<str[1]<<str[2]<<str[3]<<str[4]<<endl; 这里命题人玩了个巧妙的坑。str[1]取的是第二个字符'E',str[2]是'S',str[3]是'P',但str[4]已经越界了——字符串长度是4,下标最大只能是3,str[4]对应的是空字符\0。所以cout实际输出的是"ESP"加上一个不可见的\0,屏幕上看起来就是"ESP",绝不可能是"GESP"。这就是为什么C是正确答案。
陷阱设计极狡猾:C选项故意用下标1-4,既考0起始又考越界判读;圆括号与花括号语法相似却易被误认为等价;若只背"string str("GESP")"就选C,必掉坑。花括号构造是C++11新增,但功能与圆括号完全一致,此处命题人用此细节增加区分度。若把题干改“能输出含'G'的是”,C即排除;或字符串换成"GESP2024",C输出"ESP2"仍非"GESP"。
【考频与趋势】关联知识点“基础语法”在题库共考过1295题,覆盖11个考试级别(2008-2026);逐年分布: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三级该考点考过215题,属于高频必考。
【预测】基于2023-2026年逐年递增的趋势(287→413→401→109),未来基础语法类题目仍将是GESP三级、一级乃至四级的主战场,命题人大概率会继续在“下标访问+越界”或“花括号初始化”等细节处挖坑,难度不会降低。暂无足够依据预测具体年份的题型变化,但建议重点复习字符串构造与下标访问的边界情况。