☰
GESP2026年9月认证C++一级( 第一部分选择题(8~15题)精讲
2026/10/2 6:57:30 网站建设 项目流程


第8题:for循环结束以后,变量是多少?

题目代码:

int i, cnt = 0; for (i = 0; i < 10; i++) cnt += 1; cout << i << ' ' << cnt;

选项:

A. 10 10 B. 9 9 C. 10 9 D. 9 10

答案:

⭐ A:10 10


① 我们先认识两个“小伙伴”

程序中有:

i

和

cnt

可以把它们想象成两个小盒子。

开始:

i = ? cnt = 0

②for循环的三个机关

for (i = 0; i < 10; i++)

这个循环有三个部分:

① i = 0 → 出发 ② i < 10 → 检查能不能继续 ③ i++ → 每走一步,i增加1

循环身体:

cnt += 1;

意思就是:

cnt每次增加 1。


③ 让程序跑起来

第几次icnt
101
212
323
.........
989
10910

第10次循环时:

i = 9 cnt = 9

执行:

cnt += 1;

于是:

cnt = 10

然后最关键的一步来了:

i++

于是:

i = 10

接下来检查:

i < 10

也就是:

10 < 10

答案是:

❌ 假!

所以循环结束。

最终:

i = 10 cnt = 10

输出:

10 10

所以答案:

✅ A


⭐ 一个非常重要的坑

很多孩子会想:

“循环最后一次是i=9,所以答案应该是 9。”

错!

因为:

for (i = 0; i < 10; i++)

最后一次执行完循环体以后,还会执行i++。

所以:

循环里面最后一次是 9,循环结束时是 10。

这是一级考试中特别常见的陷阱。



第9题:负数循环 +cnt

题目代码:

int cnt, i; cnt = 0; for (i = -10; i < 0; i++) cnt += 1; cout << (i * cnt);

选项:

A. -10 B. -9 C. 0 D. 9

答案:

⭐ C:0


① 从哪里开始?

i = -10 cnt = 0

循环条件:

i < 0

②i会经历哪些数字?

-10 -9 -8 -7 -6 -5 -4 -3 -2 -1

这些数字都满足:

i < 0

所以一共循环:

10次

每次:

cnt += 1;

所以最后:

cnt = 10

③ 循环结束的时候,i是多少?

最后一次:

i = -1

循环体执行完后:

i++

于是:

i = 0

然后检查:

0 < 0

❌ 不成立。

所以循环结束。


④ 最后的计算

程序:

cout << (i * cnt);

此时:

i = 0 cnt = 10

所以:

0 × 10 = 0

答案:

✅ C


🧠 记住一个规律

对于:

for (i = -10; i < 0; i++)

结束的时候:

i不是 -1,而是 0!

因为最后还有一次:

i++

这就是第8题和第9题共同考查的:

“循环结束时,循环变量到底是多少?”



第10题:continue遇到谁?break又遇到谁?

这道题非常经典。

代码:

int i; for (i = 1; i < 5; i++) { if (i % 3 == 0) { printf("%d+", i); continue; } else { printf("%d-", i); break; } } printf("%dEND*", i);

选项:

A. 1-1 B. 1 - 1 END* C. 1+1-2-2END* D. 1-1END*

答案:

⭐ D


🧙‍♂️ 这里有两个魔法按钮

continue

意思:

这一次不玩了,直接进入下一轮循环。


break

意思:

别玩了!整个循环结束!

可以记成:

continue=跳过本轮

break=直接退场


现在开始执行

初始:

i = 1

判断:

1 % 3 == 0

显然:

1 % 3 = 1

所以条件不成立,进入:

else

执行:

printf("%d-", i);

输出:

1-

然后:

break;

💥 整个循环立即结束!


注意!

因为break已经把循环结束了,所以:

i = 2

还没发生。

程序直接来到:

printf("%dEND*", i);

此时:

i = 1

所以输出:

1-1END*

答案:

✅ D


⭐ 小口诀

看到:

continue;

想:

🚪 “这一轮出去,下一轮再来。”

看到:

break;

想:

🚪 “整座循环大门关闭!”



第11题:while循环到底会循环几次?

代码:

int N, tot; cin >> N; tot = 0; while (N > 0) { cout << N << "#"; tot += 1; N -= 1; } cout << tot << "-END";

题目问:

下面说法错误的是哪一个?

选项:

A

输入3:

3#2#1#3-END

B

输入-10:

0-END

C

输入0:

0-END

D

输入1:

1#0-END

答案:

⭐ D


我们一个一个检查

A:输入3

开始:

N = 3 tot = 0

第1次

输出:

3#

然后:

tot = 1 N = 2

第2次

输出:

2#

然后:

tot = 2 N = 1

第3次

输出:

1#

然后:

tot = 3 N = 0

现在:

N > 0

变成:

0 > 0

❌

循环结束。

最后:

cout << tot << "-END";

输出:

3-END

所以:

3#2#1#3-END

A正确。


B:输入 -10

一开始:

N = -10

检查:

N > 0

即:

-10 > 0

❌

一次循环都不进入。

所以:

tot = 0

输出:

0-END

B正确。


C:输入0

同样:

0 > 0

❌

所以:

0-END

C正确。


D:输入1

开始:

N = 1 tot = 0

循环:

输出 1# tot = 1 N = 0

最后:

1-END

所以完整输出:

1#1-END

而不是:

1#0-END

所以:

❌ D错误

答案:

✅ D


🧠 这道题最容易错在哪里?

有的同学很容易把:

N

和:

tot

搞混。

实际上:

  • N:倒计时

  • tot:计数器

可以想象:

N是“小火箭倒计时”,每次减1;
tot是“小记者”,每完成一次循环就记1笔。



第12题:用printf打印连续数字

题目输入:

35

要求输出:

35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1

代码:

int N, tot, i; cin >> N; tot = 0; for (i = 0; i < N; i++) { printf(__________); tot = tot + 1; if (tot % 10 == 0) printf("\n"); }

选项:

A. "%3d", N B. "%3d", N - i C. N - i D. N

答案:

⭐ B


先搞清楚两个变量

输入:

N = 35

N从头到尾都是:

35

而:

i

会:

0 1 2 3 4 ...

题目要求:

35 34 33 32 ... 1

那么我们可以观察:

35 - 0 = 35 35 - 1 = 34 35 - 2 = 33 35 - 3 = 32

是不是刚刚好?

所以应该打印:

N - i

为什么还要"%3d"?

选项 B:

"%3d", N - i

这里:

%3d

意思是:

用至少3个字符的位置来打印整数。

例如:

35

前面会留一个空格:

35

这样:

35 34 33 ...

数字排列会更加整齐。


⭐ 再看每10个换一行

if (tot % 10 == 0) printf("\n");

当:

tot = 10

换行。

当:

tot = 20

再换行。

当:

tot = 30

再换行。

所以最终正好是:

35~26 25~16 15~6 5~1

答案:

✅ B



第13题:continue之后,后面的代码还执行吗?

代码:

int k = 0; while (k < 8) { k += 2; continue; if (k > 5) break; cout << k << "#"; } if (k >= 8) cout << "FINISH";

选项:

A. FINISH B. 2#4#6#FINISH C. 2#4#FINISH D. 2#4#6#8#FINISH

答案:

⭐ A


这里有一个超级重要的陷阱

程序:

k += 2; continue; if (k > 5) break; cout << k << "#";

看到:

continue;

之后:

下面的代码本轮全部不执行!

也就是说:

if (k > 5)

不会执行。

cout << k << "#";

也不会执行。


让程序跑起来

初始:

k = 0

进入:

k < 8

成立。

执行:

k += 2;

变成:

k = 2

然后:

continue;

💨 直接回到while条件。


第二轮:

k = 2

加2:

k = 4

continue


第三轮:

k = 4

加2:

k = 6

continue


第四轮:

k = 6

加2:

k = 8

continue


再检查:

k < 8

也就是:

8 < 8

❌

循环结束。

注意:

整个过程中,cout << k << "#";一次都没有执行!

最后:

if (k >= 8)

成立。

所以输出:

FINISH

答案:

✅ A


🧠 一句话记忆

continue像“传送门”:一出现,后面的代码全部跳过,直接开始下一轮。



第14题:如何找到一个数的“第M位”?

这是这一组题里非常值得掌握的一题。

题目:

给一个正整数N,求它从右往左第M位。

例如:

N = 123456

从右往左:

第1位:6 第2位:5 第3位:4 第4位:3 第5位:2 第6位:1

代码:

int N, M, M10; cin >> N; cin >> M; M10 = 1; for (; M > 1; M--) M10 *= 10; cout << __________;

选项:

A. N / M10 % 10 B. N / M10 / 10 C. N % M10 % 10 D. N % M10 / 10

答案:

⭐ A


先理解M10是干什么的

开始:

M10 = 1

如果:

M = 1

不用循环:

M10 = 1

如果:

M = 2

循环一次:

M10 = 10

如果:

M = 3

循环两次:

M10 = 100

如果:

M = 4

得到:

M10 = 1000

所以:

M10 = 10^(M-1)


🌟 举个例子

假设:

N = 123456 M = 3

我们要找:

第3位

答案应该:

4

第一步:除以100

因为:

M10 = 100

所以:

123456 / 100

整数除法得到:

1234

第二步:再% 10

1234 % 10

得到:

4

刚好就是我们想要的数字!

所以:

N / M10 % 10

答案:

✅ A


🧙‍♂️ 记忆方法

求:

从右往左第M位

可以想象:

先用/把右边不需要的数字切掉。

然后:

再用% 10把最后一位抓出来。

所以:

N ↓ 除以10^(M-1) ↓ %10 ↓ 得到目标数字

口诀:

“除掉右边,留下目标;再取10,抓住一位。”



第15题:鸡兔同笼,程序哪里出了问题?

这道题非常有意思。

题目:

tou表示鸡和兔的头总数,jiao表示脚总数。判断下面程序的说法哪个正确。

程序:

int tou, jiao, tu_tou, ji_tou; cin >> tou; cin >> jiao; for (tu_tou = 0; tu_tou < tou + 1; tu_tou++) { ji_tou = tou - tu_tou; if (tu_tou * 4 + ji_tou * 2 == jiao) { printf("兔的数量=%d,鸡的数量=%d\n", tu_tou, ji_tou); break; } } if (tu_tou == tou) printf("无解\n");

选项:

A. 能求解鸡兔同笼。
B.ji_tou没有初始化,在 L1 前增加ji_tou = 0;即可求解。
C. 将tu_tou < tou + 1改为tu_tou < tou即可求解。
D. 将tu_tou == tou改为tu_tou == tou + 1即可求解。

答案:

⭐ D


第一步:程序的思路其实是对的

假设:

头有10个

那么兔子的数量可以一个一个试:

兔0只 兔1只 兔2只 兔3只 ... 兔10只

如果兔子有:

tu_tou

那么鸡就是:

ji_tou = tou - tu_tou

因为:

鸡 + 兔 = 总头数


第二步:检查脚的数量

鸡:

2只脚

兔:

4只脚

所以:

tu_tou * 4 + ji_tou * 2

就是总脚数。

如果:

总脚数 == jiao

就找到了答案。

这个思路本身没问题。


🚨 真正的BUG在哪里?

看:

for (tu_tou = 0; tu_tou < tou + 1; tu_tou++)

它会尝试:

0 1 2 ... tou

这是合理的。

因为有一种特殊情况:

全部都是兔子。

比如:

tou = 3

可能:

兔 = 3 鸡 = 0

所以必须允许:

tu_tou = tou

因此不能把:

tu_tou < tou + 1

改成:

tu_tou < tou

否则:

❌ 全部都是兔子的情况就永远检查不到。

所以 C 错。


🚨 那么问题在哪里?

看最后:

if (tu_tou == tou) printf("无解\n");

假如:

兔 = tou 鸡 = 0

那么程序已经找到了答案,并且:

break;

跳出来。

但是:

tu_tou == tou

依然成立!

于是程序会:

先说“找到答案了!”

然后:

又说“无解!”

这就出问题了。


🎯 怎么解决?

循环结束以后,如果:

tu_tou == tou + 1

才说明:

所有可能的兔子数量都尝试过了,仍然没有找到答案。

为什么?

因为循环:

for (tu_tou = 0; tu_tou < tou + 1; tu_tou++)

如果没有break:

tu_tou: 0 1 2 ... tou tou+1

最后才退出。

所以:

if (tu_tou == tou + 1)

才代表:

真的无解。

因此:

✅ D正确


🌟 8~15题考点地图

题号主要考点小朋友要掌握什么
8for循环循环结束后变量会怎样
9for循环最后一次i++
10continue、break一个跳本轮,一个结束循环
11while条件什么时候成立、什么时候结束
12printf、%N-i、每10个换行
13continuecontinue后面的代码本轮不执行
14数字拆位/10、%10
15枚举一个一个尝试 + 找到答案break

🧠 最后送给大家一套“8~15题通关口诀”

①for循环

先初始化,再看条件,执行身体,最后更新。


②break

循环立刻结束!

🚪相当于:

“我不玩了,直接回家!”


③continue

跳过这一轮,下一轮继续。

🚪相当于:

“这一关先跳过,下一关见!”


④%10

抓个位!

例如:

123 % 10

得到:

3

⑤/10

砍掉个位!

123 / 10

得到:

12

⑥ 求第M位

先/10^(M-1),再%10。

即:

N / M10 % 10

⑦ 枚举

一个一个试,试到正确答案就break。


🎯 最值得孩子形成的“程序阅读习惯”

以后遇到阅读程序题,千万不要一眼看答案。

让孩子拿一支笔,在草稿纸上画:

变量初值 ↓ 第1轮 ↓ 变量变化 ↓ 第2轮 ↓ 变量变化 ↓ …… ↓ 循环结束时变量是多少? ↓ 最后输出什么?

尤其要牢牢记住:

“循环体最后执行完,不代表循环变量停在那里。”

因为后面还有:

i++

以及:

continue会跳过后面的代码,break会直接结束整个循环。

这几个小陷阱,正是一级考试里非常喜欢考的地方。


需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询