下列程序将输出 $1$。( )
int a[10]={1};
cout<<a[1]<<endl;答案B。数组和位运算的代码追踪要特别小心:数组下标从0开始,位运算结果可能不直观。建议画图辅助。
位运算追踪时建议把数字写成二进制形式再逐位计算。
【考点】数组初始化|C++语法
🎯 考纲定位:GESP三级属于C++基础阶段,考查对基本语法和数组初始化规则的理解。命题人放这道题是为了卡住那些只背语法、不理解数组初始化细节的考生。大多数考生可能知道数组初始化,但容易忽略默认值填充,所以这道题直接测试这个薄弱点。
🧠 解题思维:首先,看到int a[10]={1};,要想到C++中数组初始化时,如果提供的初始值少于数组大小,剩余元素会被默认初始化为0。所以a[0]=1,a[1]到a[9]都是0。然后cout<<a[1]<<endl;输出的是a[1]的值,即0,而不是1。因此程序输出0,不是1。所以选项B正确。
🪤 陷阱拆解:错误选项A是“正确”,命题人利用考生对数组初始化的误解,认为{1}只初始化第一个元素,而a[1]是第二个元素,所以输出1。但实际上,数组索引从0开始,a[1]是第二个元素。另外,命题人还利用考生可能忽略默认值填充,以为数组所有元素都是1。但C++规定,当初始化列表长度小于数组大小时,剩余元素为0。所以陷阱在于数组索引和默认值填充。
🔄 反命题思维:如果改一下,比如int a[10]={1,2};,那么a[1]是2,输出2。或者int a[10]={1};但cout<<a[0]<<endl;,输出1。命题人想考的是对数组初始化的精确理解,以及索引从0开始的意识。刷到类似题时,先问自己“命题人想考我什么”,比如是考索引还是考默认值填充。