GESP 四级 · GESP 202403 C++ 四级 第 18 题

判断题 · 答案 B

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

题目

定义变量 int a = 5,则 cout << &++a 会输出 $6$。( )

答案:B

解题思维

答案B。>=是大于等于比较运算符,>>=是右移赋值运算符(a>>=3等价于a=a>>3)。两者都是合法的C++运算符。

常见错误

>=是右移赋值运算符,不是比较运算符。a>>=3相当于a=a>>3,将a右移3位。

详细解析(节选)

【考点】自增运算符优先级|取地址运算符|cout 输出表达式

【考纲定位】本题考查《GESP 考试大纲》C++ 模块"运算符优先级与表达式"中的前缀自增与取地址组合运算。命题人故意把"先自增再取地址"的直觉反着来,卡住的是考生对运算符结合性(右结合)的盲区——绝大多数人看到 &++a 就下意识认为先 ++a 再取地址,却忘了 & 的优先级更高,导致运算顺序完全相反。

【解题思维】看到 &++a,第一反应是"先自增再取地址",但必须立刻纠正:& 的优先级高于 ++,因此 &++a 实际是 (&a)++。这意味着:a 的地址被取出来作为左值,然后对这个指针执行自增(即 a 的地址 +1 字节),而不是对 a 的值自增。cout 输出的是这个新地址,显然不可能是 6(6 是 a 的值)。正确的理解链是:a=5 → &a 是 int* → (&a)++ 是地址 +1 → 输出地址。这类题的通法是:遇到复合运算符组合,先查优先级表,再判断结合方向,切忌凭直觉拆解。

【陷阱拆解】A 选项错在把 &++a 当成"先 ++a 再 &"的语法糖,忽略了 & 优先级更高。命题人还埋了"绝对化"陷阱:很多考生认为"&++a 就是 a 的地址",却忘了 &a++ 和 &++a 的区别;更隐蔽的是,他们把 cout 输出的数值 6 误以为是地址,实际上 6 是 a 的值。此外,&a 是 int*,++ 作用于指针时地址增加的是 sizeof(int)(通常为 4),但题目没问地址值,只问输出是否为 6,因此语义陷阱在于混淆"值"与"地址"。如果你只背结论"&++a 输出&a",就会掉进这个坑。

【反命题思维】如果把题目改成 cout << ++a,答案就是正确(输出 6);改成 cout << &a++,则输出仍是&a(因为&a++ 先取值再取地址,但 a 的值不变)。这类题的核心永远是"运算符优先级 + 结合性 + 值 vs 地址"。刷到类似题时,先问自己:"命题人想考我的是优先级顺序,还是左值/右值陷阱?"

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