GESP2026年9月认证C++一级( 第一部分选择题(8~15题)精讲


第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。


③ 让程序跑起来

第几次 i cnt
1 0 1
2 1 2
3 2 3
... ... ...
9 8 9
10 9 10

第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题考点地图

题号 主要考点 小朋友要掌握什么
8 for循环 循环结束后变量会怎样
9 for循环 最后一次 i++
10 continue、break 一个跳本轮,一个结束循环
11 while 条件什么时候成立、什么时候结束
12 printf、% N-i、每10个换行
13 continue continue后面的代码本轮不执行
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 会直接结束整个循环。

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


相关推荐
小小、码农1 小时前
〖Linux文件系统〗:彻底打通文件 IO 全链路
linux·开发语言·数据结构·c++·系统
東隅已逝,桑榆非晚1 小时前
priority_queue的介绍和使用
c++·经验分享·笔记·学习
茉莉玫瑰花茶2 小时前
OpenGL [ 纹理 ]
开发语言·c++·opengl
余额瞒着我当琳2 小时前
C++ map 底层与AVL 树
开发语言·c++·算法
All for pursuit.3 小时前
【贪心-2】253.会议室 II
数据结构·c++·算法·leetcode
重生之小比特3 小时前
【C++进阶】异常
开发语言·c++
朝朝辞暮i3 小时前
C++ 第 15 课:指针 * 和地址 &
开发语言·c++
奶茶树3 小时前
【C++】14. C++11新特性【下】
开发语言·c++
牢姐与蒯3 小时前
c++加餐之位图
c++·算法·哈希