GESP 七级 · GESP 202509 C++ 七级 第 2 题

选择题 · 答案 B

← 整套速查表 GESP 七级 全部真题

题目

已知 a 为 int 类型变量,p 为 int * 类型变量,下列表达式不符合语法的是( )。

答案:B

解题思维

位运算:&(与)、|(或)、^(异或)、~(取反)、<<(左移)、>>(右移)。异或性质:a^a=0,a^0=a。

常见错误

区分逻辑运算(&&,||,!)和位运算(&,|,~,!)。左移右移注意符号位的处理(算术右移vs逻辑右移)。负数的位运算要小心。

详细解析(节选)

【考点】int 类型算术运算|指针运算规则|逻辑运算符重载

🎯 考纲定位 本题考查 C++ 基础语法中运算符的适用类型约束,属于《GESP 考试大纲》六级至七级的必考知识点。命题人专门设计这道题,就是要卡住那些"会写代码但不懂类型系统"的考生——他们能把指针声明对了,却搞不清运算符到底能作用于什么类型。

🧠 解题思维 看到选项就分两步判断:先看运算符类型,再看操作数类型。A 和 B 用的是算术乘法 *,C 和 D 用的是逻辑与 &&。关键观察:int 类型变量 a 参与 a*a 完全合法;而指针 p 参与 p*p 违反"指针之间不能直接相乘"的规则。C、D 中逻辑运算符 && 是通用的,它接受任何可转换为 bool 的类型,指针本身就是可转换的,所以合法。答案锁定 B。

🪤 陷阱拆解 选项 B 的设计利用了初学者对 * 符号的误解——看到两个带 * 的对象就以为能乘。但 p*p 不是"地址乘地址",而是试图用指针运算规则去处理两个指针,这在 C++ 中是语法错误。命题人还挖了 C、D 的坑:有人可能认为"指针不能做逻辑运算",其实 && 对指针完全兼容,因为指针可隐式转 bool(非空即真)。如果你只背结论,就会把 C、D 也误判为错误选项。

🔄 反命题思维 若把 B 改成 p + p,答案就不同了——指针加法合法(同类型指针相加有明确语义)。若把 C、D 换成 a | a 或 p | p,逻辑位运算符对指针同样适用。命题人真正想考的是"运算符类型约束"而非"指针概念"。遇到类似题,先问自己:这个运算符要求什么类型的操作数?

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断