已知 double 类型的变量 a 和 b,则执行语句 a = a + b; b = a - b; a = a - b; 后,变量 a 和 b 的值会互换。
判断正误题需注意绝对化表述("一定""必须""只能"等)往往是错误的。
判断题中注意"一定""总是""所有""唯一"等绝对化表述通常是错误的。但也要结合具体知识点判断。
【考点】浮点精度|算术运算|数据类型
1. 考纲定位 本题考查《GESP 八级 C++ 大纲》中"浮点数据类型与精度"模块。命题人专门把这道题放在这里,就是要卡住那些只会背"交换算法"却不懂 double 底层表示的考生——他们以为代数上成立的逻辑在计算机里一定成立。
2. 解题思维 完整思考链:先按代数推导——三步确实能完成交换(a=a+b, b=(a+b)-b=a, a=(a+b)-a=b)。但关键观察是变量类型为 double,浮点运算存在舍入误差。a=a+b 后 a 的尾数已含误差,后续减法无法完全抵消,最终 a 和 b 的值会"极其接近"原值互换结果,但二进制表示不可能完全相等。
3. 陷阱拆解 错误选项 A 利用的是"代数正确即代码正确"的惯性思维,命题人刻意用 double 制造精度陷阱。最阴险的细节是题目未提"近似相等",只问"值会互换",在 C++ 语义下等价于"完全相等判断"。如果你只背结论而忽略类型语义,就会掉进这个坑。
4. 反命题思维 反命题视角:把 double 改成 int,答案立刻变 A;若题目加一句"是否近似相等",答案又变 A。刷到类似题先问:命题人是否在用浮点精度考我?是否在用语义陷阱考我?