第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
一步一步:
| i | tot |
|---|---|
| 0 | 0 |
| 1 | 1 |
| 2 | 3 |
| 3 | 6 |
| 4 | 10 |
最后:
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 二级判断题就会越来越稳。