下面 C++ 代码能求整数 $N$ 和 $M$ 之间所有整数之和,包含 $N$ 和 $M$。( )
int N, M, Sum;
cin >> N >> M;
if (N > M){
int tmp = N;
N = M, M = tmp;
}
for (int i = N; i < M+1; i++)
Sum += i;
cout << Sum;答案B。for循环每次迭代后执行更新表达式(如i++)。循环体执行次数由初始值、条件和更新共同决定。
循环变量的初值、终值和步长共同决定循环次数。for(i=0;i<n;i++)执行n次。
【考点】输入与输出|选择结构|循环结构|变量交换
🎯 考纲定位 “输入与输出”“选择结构”“循环结构”“变量交换”均属于 GESP 二级必考基础模块。命题人故意留一个“看似正确实则脆弱”的缺口,卡住的是考生对“输入合法性校验”和“未初始化变量使用”的盲区。
🧠 解题思维 看到题先确认范围是否被正确交换,再检查循环是否真的覆盖到 M。关键观察:for (int i = N; i < M+1; i++) 确实包含 M,但前提是 N 和 M 都有确定值。若输入非法,N、M 未初始化,Swap 交换的是垃圾值,随后循环用垃圾值累加,Sum 更是未初始化就输出。因此正确链应为:校验输入 → 交换确保 N ≤ M → 累加 → 输出。
🪤 陷阱拆解
i < M+1 已经包含 M,这是对的,但前提是 M 本身合法。🔄 反命题思维 若把 cin 换成 scanf("%d%d",&N,&M) 且加 if (N > M) swap(N,M); else if (N < M) swap(N,M); 甚至再补 if (N > M) swap(N,M);,答案会变吗?不会,因为真正的考点是“未初始化”和“输入校验”,不是交换语法。刷到类似题,先问自己:有没有可能输入不合法?有没有可能变量没初始化就用?这才是命题人想让我警惕的。