下面 C++ 执行后将输出 3*2=6。( )
int a=2, b = 3;
a = a - b;
b = a + b;
a = b - a;
printf("%d*%d=%d\n", a, b, a*b);答案A。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】变量赋值与运算顺序|中间状态跟踪
GESP 二级 C++ 模块「基础语法」中「变量与运算」考点。命题人专盯考生对赋值语句顺序执行的理解——多数人会误以为三行代码能同时交换 a、b 的值,实则依赖中间变量的状态更新,这是区分“知道公式”与“懂过程”的关键。
按顺序逐行推演:初始 a=2,b=3;执行 a=a-b 得 a=-1;接着 b=a+b 得 b=2;最后 a=b-a 得 a=3。此时 a、b 确实完成互换,输出 3*2=6 完全正确。此类题通法永远是“单步跟踪”,切忌跳步或脑补并行执行。
错误选项 B 利用“交换变量”的直觉陷阱——很多考生看到三行赋值就以为能直接互换 a、b,忽略中间 a 先被赋负值的事实。命题人特意设计 a=a-b 而非 t=a;b=a;a=t,就是想测试你是否真的理解赋值是即时覆盖而非数学公式。
换个角度,若把 a=a-b 改为 a=a*b,中间值会变成 6,后续逻辑全崩,这提醒我们:任何变量操作都必须考虑当前状态的即时性。刷到类似题先问“这行代码修改后,下一行引用的是旧值还是新值?”