☰
GESP2026年9月认证C++二级( 第二部分判断题(1~10题)精讲
2026/10/1 20:24:04 网站建设 项目流程



第1题:cin和scanf是不是用来输入?

题目说:

C++ 程序执行cin或scanf语句时,通常是使用键盘等输入设备来输入某个变量的值。

答案:✅ 正确

题目原文就是这样描述的。

①cin是什么?

例如:

int age; cin >> age;

程序运行以后:

请输入年龄:

我们从键盘输入:

10

于是:

age = 10;

可以把cin想象成:

🕳️程序打开了一扇“输入窗口”,等你从键盘把数据扔进来。


②scanf呢?

例如:

int age; scanf("%d", &age);

同样可以从键盘输入:

10

所以:

cin scanf

都可以完成输入数据。

小口诀

cin 是 C++ 的输入小管家,scanf 是 C 语言时代的输入工具。

所以第1题:

√



第2题:5 && 2为什么输出 1?

题目:

cout << (5 && 2);

题目说输出1。

答案:✅ 正确。

这道题看起来像数学题,其实它是逻辑题!


①&&是什么意思?

&&叫做:

逻辑与

意思是:

左边和右边都是真的,结果才是真的。

例如:

真 && 真 = 真 真 && 假 = 假 假 && 真 = 假 假 && 假 = 假

② C++ 中什么叫“真”?

对于普通数字:

0 → 假 非0 → 真

所以:

5

是“真”。

而:

2

也是“真”。

于是:

5 && 2

其实就是:

真 && 真

结果:

真

C++ 输出布尔值时:

true → 1 false → 0

所以:

cout << (5 && 2);

输出:

1

🧠 小口诀

0是假,非0是真;两个都真,&&才真!

所以第2题:

√



第3题:2 * -'2' / 4真的是 -1 吗?

题目:

2 * -'2' / 4

题目说结果是:

-1

答案:❌ 错误。

这里有一个超级容易骗人的小陷阱:

'2'是数字 2 吗?

不是!


①'2'是字符

在 C++ 中:

2

是数字。

而:

'2'

是字符。

字符'2'在计算机中有一个对应的整数编码,常见 ASCII 编码中:

'2' = 50

所以:

-'2'

就是:

-50

② 继续计算

原式:

2 * -'2' / 4

相当于:

2 * (-50) / 4

先算:

2 × (-50) = -100

再:

-100 / 4 = -25

所以答案应该是:

-25

不是-1。


🧠 小口诀

带引号的是字符,不带引号的是数字!

例如:

2 '2'

千万不要混为一谈。

所以第3题:

×



第4题:==到底有没有“赋值”功能?

题目:

int a; a = 5; a == +5; cout << a;

题目说:

程序执行后的输出是10。

答案:❌ 错误。

这道题是经典陷阱!


① 第一行

int a;

创建一个整数变量:

a

可以想象成:

📦 一个叫a的盒子。


② 第二行

a = 5;

这里的:

=

是赋值符号。

意思:

把 5 放进 a 这个盒子。

于是:

a = 5

③ 第三行才是陷阱!

a == +5;

这里不是:

=

而是:

==

==的意思是:

比较左右两边是否相等。

它相当于问:

a 和 +5 相等吗?

因为:

a = 5 +5 = 5

所以答案是:

true

但是!

⚠️它没有修改a!

a还是:

5

④ 最后一行

cout << a;

所以输出:

5

不是:

10

🧠 一定要记住

= → 把东西放进去 == → 拿出来比较

就像:

=是“放东西”,
==是“问问题”。

所以第4题:

×



第5题:not not 5会输出 5 吗?

题目:

cout << (not not 5);

题目说:

输出 5。

答案:❌ 错误。

这是一个非常有趣的“布尔魔法”!


① 先看数字 5

C++ 中:

0 → 假 非0 → 真

所以:

5 → 真

② 第一个not

not 5

就是:

not 真

所以变成:

假

也就是:

false

③ 再来一个not

原来:

not not 5

现在相当于:

not 假

结果:

真

输出布尔值:

true → 1

所以输出:

1

而不是:

5

🧠 像魔法一样记:

5 ↓ 真 ↓ not 假 ↓ not 真 ↓ 1

所以:

第5题 ×



第6题:谁能被3整除?

题目代码:

for (int i = 1; i < 10; i++) if (not(i % 3)) cout << i;

题目说:

执行后输出369。

答案:✅ 正确。

我们来玩“3的倍数抓捕游戏”!🎯


①i会经过哪些数字?

for (int i = 1; i < 10; i++)

所以:

1 2 3 4 5 6 7 8 9

一个一个检查。


② 看i % 3

%是求余数。

例如:

1 % 3 = 1 2 % 3 = 2 3 % 3 = 0 4 % 3 = 1 5 % 3 = 2 6 % 3 = 0 7 % 3 = 1 8 % 3 = 2 9 % 3 = 0

③ 再看not

条件:

not(i % 3)

当:

i % 3 = 0

时:

not 0

因为:

0是假

所以:

not 假 = 真

于是只有:

3 6 9

会被输出。

而程序没有写空格:

cout << i;

所以三个数字直接粘在一起:

369

🧠 神奇口诀

i % 3 == 0,就是“3的倍数”;加上not,就是在抓余数为 0 的数字。

所以第6题:

√



第7题:这个程序能算 0 到 N 的总和吗?

代码:

int N, tot, i; cin >> N; tot = 0; for (i = 0; i < N + 1; i++) tot += i; cout << tot;

题目说N是整数:

能输出 0 到 N 之间(包含 N)的所有数之和。

答案:❌️错误。


① 假设输入

4

那么:

N = 4

② 看循环条件

i < N + 1

也就是:

i < 5

而:

i = 0

开始,每次:

i++

所以:

i = 0 i = 1 i = 2 i = 3 i = 4

刚好包含:

0 1 2 3 4

③tot += i

一步一步:

itot
00
11
23
36
410

最后:

10

正好:

0 + 1 + 2 + 3 + 4 = 10

看起来这句话是正确的。


🧠 小口诀

从 0 开始,条件写i < N+1,就能走到 N。


但是这道题说的,N是整数,有可能是负整数。

当N是负整数的时候,这道题是无法实现累加器的功能的。

程序应该为:

int N, tot, i; cin >> N; tot = 0; if(N>=0) { for (i = 0; i < N + 1; i++) tot += i; } else { for (i = 0; i > N -1; i--) tot += i; } cout << tot;

所以第7题:

错误❌️



第8题:输出真的为 0 吗?

代码:

int cnt, i, j; cnt = 0; for (i = 0; i < 10; i++) { continue; for (j = 0; j < i; j++) cnt += 1; } cout << i * cnt;

题目说:

输出值为 0。

答案:✅️正确。

这道题,就是故意来考一个坑!


第一步

cnt = 0;

第二步

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

结果是:

for (j = 0; j < i; j++) cnt += 1;

全部没有执行,最后cnt 还是0


第三步

cout << i * cnt;

输出:0

答案:✅️正确。



第9题:鸡兔同笼程序真的“能求解”吗?

这一题非常有意思。

题目说这个程序能够解决鸡兔同笼问题。

程序核心:

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); } if (tu_tou == tou) printf("无解\n");

判断:

❌ 错误

这一题不是计算公式的问题,而是程序有一个小漏洞。


① 假设有 3 个头、8 只脚

也就是:

tou = 3 jiao = 8

实际上:

2只鸡 + 1只兔

正好:

2 × 2 + 1 × 4 = 8

所以应该有解。

程序在循环过程中确实可以找到:

兔 = 1 鸡 = 2

于是输出:

兔的数量=1,鸡的数量=2

② 但是循环结束以后发生了什么?

循环:

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

最后一定会让:

tu_tou = tou + 1

因为只有这样才能让:

tu_tou < tou + 1

变成假。

所以循环结束后:

tu_tou == tou

是假的吗?

注意!

例如:

tou = 3

结束时:

tu_tou = 4

所以:

tu_tou == tou 4 == 3

是假的。

这一点本身没有问题。


那真正的问题是什么?

我们仔细看:

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

由于循环最终结束时:

tu_tou = tou + 1

所以这个条件实际上永远不会成立。

也就是说:

程序找到答案可以输出,但“无解”的判断是错误的。

所以这个程序不能完整正确地解决鸡兔同笼问题。

🧠 这题教我们的一个重要道理

程序能找到答案 ≠ 程序一定正确。

还要检查:

“没有答案的时候,它能不能正确告诉我没有答案?”

要解决这个问题,可以增加一个标志变量:

int flag = 1; 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); flag = 0; } } if (flag) printf("无解\n");

所以第9题:

× 错误



第10题:sqrt(N) == abs(M)就能判断 N 是 M 的平方吗?

程序核心:

if (int(sqrt(N)) == abs(M)) printf("%d是%d的平方\n", N, M);

题目说它可以判断:

正整数 N 是不是 M 的平方。

答案:❌ 错误。

这是最后一个大陷阱。


① 先看一个正常例子

假设:

N = 9 M = 3

那么:

sqrt(9) = 3 abs(3) = 3

所以:

3 == 3

成立。

输出:

9是3的平方

这当然是正确的。


② 但是换一个数字!

假设:

N = 10 M = 3

我们知道:

3 × 3 = 9

而:

10 ≠ 9

所以:

10 不是 3 的平方。

但是程序怎么算?

sqrt(10)

大约是:

3.162...

然后:

int(sqrt(10))

会把它变成:

3

再看:

abs(3)

还是:

3

于是程序判断:

3 == 3

成立!

程序居然会说:

10是3的平方

这显然是错的。


🎯 10道题的“陷阱地图”

现在把这10题放在一起看,就会发现它们其实不是乱考的,而是在考几个非常重要的“反粗心能力”。

题号结果最大陷阱
1✅cin/scanf是输入
2✅非0是真,&&两边都真才真
3❌'2'是字符,不是数字2
4❌=和==不一样
5❌not操作的是真假
6✅%3判断3的倍数
7❌整数有正整数也有负整数
8✅continue后面的语句不执行
9❌程序不仅要考虑“有解”,还要考虑“无解”
10❌int(sqrt(N))会截断小数

🧠 小学生考场“判断题五步法”

以后看到 C++ 判断题,不要急着打勾打叉,可以按照下面五步走:

第1步:找“关键词”

看到:

= == % && not ++ --

马上警觉!


第2步:看变量到底有没有改变

例如:

a = 5; a == 10;

第二句只是比较。

所以:

a还是5

第3步:遇到循环,真的跑几遍

例如:

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

不要凭感觉。

直接写:

0 1 2 3 4

第4步:遇到%,马上想“余数”

例如:

i % 3

重点就是:

除以3以后余多少?

特别是:

i % 3 == 0

就是:

i 是 3 的倍数。


第5步:判断“程序是不是所有情况都正确”

这就是第9、10题给我们的高级提醒:

程序跑通一次,不代表程序正确。

要想:

正常情况 ✔ 边界情况 ✔ 特殊情况 ✔ 没有答案的情况 ✔

全部考虑。


⭐ 最后送孩子一句话

判断题不是“猜 √ 还是 ×”,而是给程序当小侦探。

看到代码以后,脑子里要出现一条小小的“程序运行轨道”:

变量现在是多少? ↓ 条件是真是假? ↓ 循环执行几次? ↓ 变量有没有改变? ↓ 最后到底输出什么?

只要能坚持**“逐行模拟 + 找陷阱”**,这类 GESP 二级判断题就会越来越稳。


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

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

立即咨询