第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但是⚠️它没有修改aa还是5④ 最后一行cout a;所以输出5不是10 一定要记住 → 把东西放进去 → 拿出来比较就像是“放东西”是“问问题”。所以第4题×第5题not not 5会输出 5 吗题目cout (not not 5);题目说输出 5。答案❌ 错误。这是一个非常有趣的“布尔魔法”① 先看数字 5C 中0 → 假 非0 → 真所以5 → 真② 第一个notnot 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一步一步itot00112336410最后10正好0 1 2 3 4 10看起来这句话是正确的。 小口诀从 0 开始条件写i N1就能走到 N。但是这道题说的N是整数有可能是负整数。当N是负整数的时候这道题是无法实现累加器的功能的。程序应该为int N, tot, i; cin N; tot 0; ifN0 { 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是字符不是数字24❌和不一样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 二级判断题就会越来越稳。