执行以下代码后,输出结果是:( )。
char s[10] = "abcde";
int a = sizeof(s) / sizeof(s[0]);
int b = strlen(s);
cout << a - b;答案B。数组和位运算的代码追踪要特别小心:数组下标从0开始,位运算结果可能不直观。建议画图辅助。
位运算追踪时建议把数字写成二进制形式再逐位计算。
【考点】数组与字符串存储|sizeof 与 strlen 的差异
1. 🎯 考纲定位:GESP 三级 模块 1.2 数组基础与 1.3 字符串处理。命题人卡住的是"数组长度"与"字符串长度"的混淆,这是新手最容易栽跟头的地方——很多考生会以为数组大小就是字符个数,忽略了'\0' 占位。——数组长度是物理占用,字符串长度是逻辑内容,这是命题人特意区分的两个概念。
2. 🧠 解题思维:char s[10] 分配 10 个字节,含'\0'。sizeof(s) 是 10,除以 sizeof(s[0]) 得 10;strlen(s) 只数'\0' 前的字符,得 5。a - b = 5。注意:strlen 遇到'\0' 就停,不会走到数组末尾,这是关键。sizeof(s[0]) 是 1 字节,所以 a = 10 / 1 = 10。strlen 不会越界读取,所以即使数组未初始化,只要'\0' 在范围内,结果依然正确。
3. 🪤 陷阱拆解:A 项 4 是把数组长度当成 6(误算字符数);C 项 6 是忘记'\0' 占位;D 项 10 是直接用 sizeof(s) 没除元素大小。这些错误都源于对 sizeof 和 strlen 语义的误解——sizeof 是容器大小,strlen 是逻辑长度。B 项 5 是正确答案,因为 a 是容器长度,b 是逻辑长度,两者之差正好是'\0' 占用的 1 字节。——很多考生看到 'char s[10]' 就以为长度是 10,但题目问的是 a - b,所以必须分别计算。
4. 🔄 反命题思维:若改成 char s[20] = "abcde",a 变成 20,结果 15;若用 char* p = "abcde",sizeof(p) 是 8,a 变成 8,结果 3。刷到类似题先问:考的是容器长度还是字符串长度?——若改成 char s[10] = "abcde",a 还是 10,结果不变;若改成 char s[10] = "abcdefg",b 变成 7,结果 3。