阅读下面的 C++ 代码,其中变量都是整型,则说法正确的是( )。
cin >> a >> b;
while (b != 0) {
remainder = a % b;
a = b;
b = remainder;
}
cout << a;答案D。运算符是C++的重要组成部分。要区分不同运算符的使用格式和优先级。
\=不是合法运算符。注意区分 =(赋值)、==(相等比较)、!=(不等比较)。
【考点】欧几里得算法|取模运算|循环边界
【解题思维】代码本质是辗转相除法求 GCD。当 a=0 时,第一轮取模 0%b=0,a 被赋为原 b 值,b 变为 0 后循环终止,输出即原 b;当 b=0 时循环直接跳过,输出 a(0)。无论 b 正负,abs(b) 均与输出绝对值一致,这就是 D 项成立的数学依据。
【陷阱拆解】A 项假想"b=0 会进循环",忽略了 while(b!=0) 本身就是防除零的保护;B 项把"被除数需小于除数"的误解套用到取模上,其实 a%b 对任意 a 都合法;C 项否定负数取模,C++ 中负数取模有明确定义且算法仍收敛;D 项看似需要讨论"b 为 0 时",但此时输出 0 而 abs(0)=0 依然成立——命题人故意把"全边界情况"塞进一个选项里,只有真正理解循环逻辑的人才能一眼看穿。
【反命题思维】若把 cin 改为 a=0、b=0 直接赋值,循环条件不变,输出仍为 0,abs(b) 依旧匹配;若把代码改成先交换 a、b 再执行,对 a=0 的情况输出会变,但 abs(b) 结论仍成立——这类题刷到先问:"循环条件是否已经覆盖了所有极端输入?"