ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

GESP C++一级备考全攻略:知识点地图与易错点剖析

GESP C++一级备考全攻略:知识点地图与易错点剖析

简介:2023年6月GESP C++一级真题文档,面向备战CCF GESP C++一级考试的考生与信奥赛初学者,内容涵盖单选题、判断题与编程题三大题型,并配有逐题知识点解析与解题思路。文档为docx格式,整包共1个文件,大小仅71KB,无需安装额外环境即可直接打开使用。目前已有1242人学习,是考前快速熟悉真实题型与命题风格的高性价比资料。试卷部分完整呈现了真题原貌,从计算机输出设备、ChatGPT能力边界到常量数据类型、C++标识符规则、运算符优先级与模运算等高频考点均有涉及;解析部分不仅说明正确选项,还逐个指出干扰项的错误原因,帮助考生真正理解C++语法细节。编程题则以“时间规划”“累计相加”为例,演示如何将实际场景转化为程序逻辑,并给出变量定义、分钟换算、求和模型等分步思路。无论初次接触GESP的初学者,还是希望查漏补缺的进阶学习者,都能借助这份资料明确考查重点,提升应试效率。

1. GESP C++ 一级备考:一张知识地图,先看清考什么

GESP 一级真题的结构非常固定:30 分单选题、20 分判断题、50 分编程题。这三块对应三种完全不同的能力——单选考"认得出"(硬件常识、语言细节),判断考"拎得清"(概念边界和反例),编程考"写得对"(把文字描述翻译成可运行代码)。这张地图先立起来,后续所有复习模块都挂在上面:硬件与类型系统、表达式与运算符、流程控制,然后是高频易错点,最后落到编程题实战。它适合刚学完 C++ 基础、想用真题检验自己的初学者,也适合考前急需定位薄弱环节的备考生。按模块过一遍,比盲目刷题高效得多,因为这份卷子的考点重复率很高,摸清规律后很多题就是换皮不换核。

2. 硬件常识与语言基础:输出设备、数据类型、标识符规则

2.1 输出设备判定与硬件框架

第一道单选就考输出设备,四个选项里麦克风、音箱、打印机、显示器只有一个是异类。麦克风接收声波并转换成电信号送进计算机,属于输入设备;音箱把电信号还原成声音送到人耳,是输出设备;打印机和显示器都属于输出设备。这里每年都有人选错,因为平时说话时"麦克风出声"造成了错觉——判断输入还是输出,标准只有一个:看数据流向。数据从外部进计算机就是输入,从计算机流向外部就是输出。用这个标准去套耳机(既是输入又是输出,但一级默认按输出讲)、摄像头(输入)、扫描仪(输入)、投影仪(输出),比死记设备清单稳妥得多。

判断题第一题考计算机硬件五大部件:运算器、控制器、存储器、输入设备和输出设备,这是最基础的框架题。运算器和控制器合起来构成 CPU,存储器分内存和外存——硬盘也属于存储器。这个框架能帮你把很多零散题目归位:第一道单选考的是"输入输出设备"这一支,判断题第 1 题考的是整个五大部件的完整罗列,两道题其实都在同一个知识树上。

判断题第二题涉及中国计算机发展史:国产第一台通用数字电子计算机诞生于 1958 年,比美国 1946 年诞生的第一台通用电子计算机晚了十多年。这道题表面考历史年份,实际上考的是"通用数字电子计算机"这个限定词——早期有些电子计算机只能做特定计算,不能算"通用"。理解"通用"与"专用"的差别,比死背年份更关键。这类带年份的题目,复习时整理成一条时间线即可,不必深挖。

还有一道题是问聊天机器人程序不能完成哪个任务。选项是改邮件、编剧本、擦地板、写代码——前三个都是文本生成类工作,唯独擦地板属于物理世界操作。这道题考的是对话式 AI 的能力边界:它能处理数字化信息,不能直接操作物理世界。答题逻辑就是排除法,找出那个不属于"信息处理"的选项。这类题目近年出现频率不低,本质考的是"程序能处理什么"的边界意识,和编程本身关系不大。

2.2 常量、变量与类型系统

常量 '3' 的数据类型是 char,这道题的正确率常年不高,因为初学者习惯把 '3' 看成数字 3。带单引号的字符字面量在 C++ 里就是 char 类型,哪怕这个字符长得像数字。不带引号的 3 是 int,3.0 是 double,3.0f 是 float。梳理下来会发现,这道题其实在考"字面量的书写形式决定类型"——你写出来是什么样子,编译器就按什么类型去理解,这一点比背诵类型定义有用得多。

变量那道题把四个最容易混淆的表述放在一起。A 说"变量可以没有定义"——错,C++ 要求先定义后使用。B 说"对一个没有定义的变量赋值,相当于定义了一个新变量"——错,这会导致编译错误或未定义行为。C 说"执行赋值语句后,变量的类型可能会变化"——错,变量的类型在定义那一刻就固定了,赋值只能改值不能改类型。D 说"执行赋值语句后,变量的值可能不会变化"——对,给变量赋一个和当前值相同的值,值确实不变。这道题提醒我们,复习变量时要把"定义、声明、赋值"三件事分开理解,定义是为变量分配空间并确定类型,赋值只是往这个空间里写值。

判断题里"10 是一个 int 类型常量"是对的,这正好和 '3' 是 char 凑成一对,建议放在一起复习。另一道判断题说"计算结果必须存储在变量中才能输出",这是错的——cout << a + b;直接输出表达式结果完全合法,表达式本身就是有值的,不需要先存进变量。初学者写代码时习惯多定义一个变量再输出,虽然不影响程序正确性,但说明对"表达式可以直接作为输出参数"这个事实不够笃定。

2.3 标识符、关键字与边界案例

标识符规则只有三条:只能由字母、数字、下划线组成;不能以数字开头;不能是关键字。真题里那个很长的标识符number_of_Chinese_people_in_millions就是冲着规则去的——由字母和下划线组成,以字母开头,不是关键字,完全合法。360AntiVirus非法是因为数字开头,Man&Woman非法是因为&不在合法字符集里,break非法是因为它是关键字。

最容易翻车的是判断题里那句"标识符的命名不能完全由数字组成,至少有一个字母就可以"。这个表述把规则歪曲成了"至少含一个字母",但真正的规则是"不能以数字开头"。按"至少有一个字母"的标准,1abc应该合法,但它以数字开头,实际非法。反过来,_123不含任何字母,理论上也能作标识符(尽管不推荐)。所以这道题是错的,错在把"不能以数字开头"错误地等同于"至少有一个字母"。复习时建议自己构造几个边界例子:_123、1a、a1、a_b2,把合法和非法的边界彻底搞清楚。

关键字那道题,double、else、while都是 C++ 关键字,只有endl不是。endl是标准库提供的一个流操作符对象,负责输出换行并刷新缓冲区,它不属于语言关键字。这里要建立一个意识:关键字是语言语法的一部分,标准库里的名字不是关键字。同样的例子还有cout、cin、string、vector——它们都在std命名空间里。这个区分在后续学习里会反复出现,一级阶段先记住"endl不是关键字"就够用了。

3. 表达式与运算符:赋值、算术与逻辑的最容易失分区

3.1 赋值语句的左值约束

真题问哪个语句不符合 C++ 语法,正确选项是a + c = b + c。这个写法在数学里说得通,但 C++ 里的赋值号左边必须是一个"可修改的左值",a + c是一个表达式,不是一个变量,不能被赋值。这就是赋值语句的第一条硬语法:左侧必须是变量。

同题的其他三个选项都很有深意。a = (b == c)合法,因为(b == c)的结果是布尔值,赋给int变量a时会被自动转换成 0 或 1。b = 5.5合法,但发生精度丢失——double的 5.5 赋给int会截断成 5,这在后面整数除法相关题目里是同一个原理。c = a + b + c合法,C++ 的赋值语义是先完整算出右侧表达式的值,再执行赋值,所以不会出现"c 被覆盖导致求和错误"的错觉。这三条合在一起,几乎覆盖了一级考试关于赋值语句的全部考点。

另外判断题里有一道"如果 a 和 b 为 int 类型的变量,则表达式 a = b 可以判断 a 和 b 是否相等",答案是错。a = b是赋值,把 b 的值写进 a,返回值是 a 的新值;判断相等要用a == b。这个错误极其常见,尤其是刚从数学思维转过来的人,看到等号就觉得是"等于"。写代码时如果发现逻辑判断不生效,先检查是不是把==写成了=——这是 C++ 里出现频率最高的低级错误之一,几乎每个初学者都踩过。

3.2 整数除法与浮点运算的混用

如果 a 和 b 是 int 类型,值分别为 7 和 2,问哪个表达式结果不是 3.5。四个选项是0.0 + a / b、(a + 0.0) / b、(0.0 + a) / b、a / (0.0 + b)。答案是0.0 + a / b,因为运算符优先级里除法先于加法,a / b先被计算,两个 int 相除执行整数除法,结果是 3 而不是 3.5,然后0.0 + 3得到 3.0。其余三个表达式都是把0.0放在分子或分母里,让除法在 double 域内执行,结果自然是 3.5。

这个考点背后的机制只有一句话:只要参与运算的两个操作数都是整数,除法就按整数除法执行,小数部分直接截断;只要有一个是浮点类型,整个除法就按浮点运算执行。这个规则在编程题里也会出现,比如计算时间差时如果先做整数除法再做乘法,很容易把中间结果截掉。建议把 7 / 2、7.0 / 2、7 / 2.0、0.0 + 7 / 2 四个表达式亲手跑一遍,感受一下混用浮点带来的差异。

判断题里"表达式 (37 / 4) 的计算结果为 9,且结果类型为 int"也是同一个考点。37 除以 4 的数学结果是 9.25,但两个 int 相除直接截断成 9,类型为 int。这道题在判断题里属于送分题,前提是你在复习时没有跳过"整数除法要截断"这个细节。另一个容易漏的点是,截断和四舍五入是两回事——有些初学者以为37 / 4会算成 9(四舍五入恰好也是 9),换个例子37 / 5就会露馅,结果是 7 而不是四舍五入的 7。

3.3 复合赋值、逻辑表达式与运算符优先级

a %= 4等价于a = a % 4,如果 a 是 6,那结果就是 2。这道题没有任何陷阱,唯一要确认的是复合赋值运算符的展开语义:先把右侧表达式整体求值,再和左侧变量做对应运算。同类运算符还有+=、-=、*=、/=,建议在复习时把五个放在一起过一遍,重点注意a /= b时如果 a、b 都是 int,结果是截断后的整数。

逻辑判断那道题很经典:判断 a 等于 0 且 b 等于 0。A 选项(a == b == 0)是专门设置的陷阱——==是左结合的,(a == b)先被计算,结果是布尔值 true 或 false,然后这个布尔值再和 0 比较。当 a 和 b 都是 0 时,a == b为 true(int 值是 1),1 == 0 为 false,整个表达式反而判不出"两个都是 0"。C 选项(a + b == 0)也不行,a = 1、b = -1 时和为 0 但两个都不是 0。D 选项(a == 0) + (b == 0)的结果是 int 2,不是布尔值,也不能作为"且"的判断。正确答案是 B:!(a || b),当 a 和 b 都为 0 时,a || b为 false,取非要它变成 true。

这道题的教训是:C++ 的逻辑表达式和数学表达式长得像,但语义完全不同,尤其是==的左结合性带来的连锁比较陷阱。复习时建议特意练几道"把数学判断翻译成 C++ 表达式"的题,比如判断三个数是否相等、判断三个数是否都为正数,练完再回去看这种题会轻松很多。

另外选择题里还有一道算术混合题:(4 * (11 + 12) / 4)的计算结果。注意乘除是从左到右依次执行的,4 乘以 23 得到 92,除以 4 得到 23。如果括号位置换一下变成4 * ((11 + 12) / 4),结果就是 4 * 5 = 20,因为括号里的整数除法先截断成 5。这类题不需要背优先级表,只需要记住两点:括号最高,乘除和加减各自从左到右,整数除法会截断。考前把这四个小规则过一遍就够。

4. 流程控制与程序行为:分支、循环与整体输出

4.1 分支结构与 do...while 的执行语义

判断题里"if 语句可以没有 else 子句"是对的。if 单独使用完全合法,else 是可选部分。这个结论看似简单,但后续学习里会出现一个衍生考点:else 与最近的 if 配对。遇到嵌套 if 时要特别注意括号,否则会出现"else 挂错 if"的经典错误。一级阶段不需要写很深的嵌套,但建议在练习时故意把 if else 写成不缩进的样式,强迫自己靠括号判断配对关系。

判断题里"do...while 语句的循环体至少会执行一次"也是对的。这涉及 do...while 和 while 的根本区别:do...while 先执行循环体再判断条件,所以无论条件是否成立,循环体至少被执行为一次;while 先判断再执行,条件一开始为 false 就一次都不执行。这个区别是流程控制部分最重要的考点之一,做题时看到 do...while 就默认"至少执行一次",再去推后续逻辑。

这两种结构对应的常见考法是:给一段短代码,判断某个变量在循环结束后的值。这类题最容易在循环边界上出错,比如while (i <= 10)和while (i < 10)的循环次数就不同。建议复习时把循环区间当成专门的训练点:小于、小于等于、大于、大于等于,四种边界各写一个例子,跑一遍确认结果。

4.2 循环与取模的组合推理题

真题里有一道代码填空,要求输出"147"。已知选项是i % 2 == 1、i % 3 == 1、i = i + 3、i + 3,可以推断出代码结构大致是循环内先判断一个条件,满足才输出 i 的值。输出序列 1、4、7 对应 i 取 1、4、7 时刻,这三个数模 3 都余 1,所以正确选项是i % 3 == 1。如果是取模 2,序列会是 1、3、5 这种奇数序列,和 1、4、7 不匹配。

这类"循环 + 取模"组合题是一级考试的常客,背后的逻辑是:取模运算能把一维的循环序列映射成周期性序列,从而筛选出符合某种余数条件的数。复习时建议自己写一个循环,依次输出 i 从 1 到 10 时i % 2、i % 3的值,把"余数周期"这个直觉建立起来。另一种变体是i = i + 3这种步长型选项,和取模筛选很相似,区别在于步长型是直接控制 i 的取值序列,取模筛选是 i 正常递增但通过条件决定是否输出。做题时先看代码里 i 是怎么变的,再判断选项对输出序列的影响。

还有一道考"执行程序后输出结果"的题,四个选项是 63、98、113、无法确定。这类题没有给出完整程序代码,但从选项能看出来,它考的是对循环变量在程序执行过程中变化的追踪能力。做题方法是逐行推演:用草稿纸列一个表,每行记录当前循环变量、累加变量、输出变量三个值,模拟每一步变化。整个过程很像手动执行一遍程序,虽然费一点时间,但准确率最高。特别要注意循环的进入条件和退出条件,如果循环条件依赖于某个运行时输入,且题目没有给出输入值,那答案选"无法确定"的概率就很高。

4.3 程序行为题的标准分析方法

程序行为题(给代码求输出)在单选和判断里都会出现,它不需要你写代码,但需要你在纸上推演。推演有个固定套路:先圈出所有变量声明,确认每个变量的类型;再找到循环或分支的边界条件;然后逐行执行,每次变量变化都记录最新值。这里面最值得警惕的是变量类型导致的隐性变化。比如某个变量是 int,中间被赋了一个浮点数表达式的结果,值会被截断,这会影响后续所有计算。

另一个常见陷阱是循环体内的赋值语句改变了判断条件里用到的变量,导致循环次数和直观预期不一致。这时候不要在脑子里"感觉"循环会执行几次,老老实实走一遍草稿纸推演。考场上时间充裕,这类题只要耐心推演就一定能做对,丢分通常是因为图快跳步。

5. 易漏点排查:六个最容易丢分的细节

复习完前面四个模块,如果只是把概念看了一遍就上考场,最容易在下面这些细节上翻车。它们不是独立的知识点,而是藏在各个模块缝隙里的坑,整理成清单逐条过一遍效果最好。

5.1 未定义变量直接赋值:编译错误而非"新变量"

易漏点是:对没有定义的变量赋值,以为会自动定义一个新变量。之所以会漏,是因为 Python 等脚本语言允许这种写法,带着这个习惯来写 C++ 就会踩坑。怎么补:在编辑器里输入未定义变量会立刻看到编译错误,平时写练习时不要把错误提示关掉,刻意让编译器来"抓"你几次,印象就深刻了。C++ 的规则是"先定义后使用",定义语句确定了变量的名字和类型,之后才能对它赋值。

5.2 赋值号当作等号用:判断逻辑被悄悄改写

易漏点是:写完if (a = b)还以为自己在判断 a 是否等于 b。之所以会漏,是因为数学里等号的含义太根深蒂固,看到单个等号就自动翻译成"等于"。怎么补:写判断条件时强制写成b == a这种把常量放左边的风格,一旦误写成b = a编译器会给出警告;更重要的是养成写完条件后回头扫一眼的习惯,专门找if (后面的单个等号。这个错误在考试里不会让你编译,但会在判断题和代码分析题里反复出现,把"赋值语句返回新值"这个特性记住,就能识别出这类陷阱。

5.3 整数除法截断:3.5 变成 3 的无声事故

易漏点是:两个 int 相除时忽略了截断,导致后续计算结果偏差。之所以会漏,是因为数学里除法的结果是一个精确的数,而 C++ 的整数除法只保留整数部分。怎么补:在任何涉及除法的地方,先问自己两个操作数是不是都是 int。如果希望保留小数,至少把其中一个操作数改成浮点形式,比如a * 1.0 / b或(double)a / b。做题时看到 7 / 2、37 / 4 这类表达式,先在草稿纸上写清楚"结果是 3 和 9,不是 3.5 和 9.25"。

5.4 判断偶数用错取模条件:a % 4 == 2 不是偶数判断

易漏点是:用a % 4 == 2判断偶数,还觉得挺有道理。之所以会漏,是因为取模运算练得少,对"模 2 才是奇偶判断"这个结论不够敏感。怎么补:把 % 2 的两个分支写死在笔记里——a % 2 == 0是偶数,a % 2 == 1是奇数。遇到任何判断题,只要出现"判断偶数"的字样,直接锁定模 2,不要被其他模数干扰。真题里那道判断题就是专门考这个,正确表述是a % 2 == 0,a % 4 == 2只能说明 a 除以 4 余 2,比如 6、10、14,它们确实都是偶数,但这个条件会漏掉 2、4、8 这些偶数,所以不是有效的偶数判断。

5.5 复合赋值展开时忘记右侧先求值

易漏点是:把a += b * c理解成"先算 a + b 再乘 c"。之所以会漏,是因为复合赋值运算符的展开语义和直观理解有偏差,没有意识到右侧是"整体先求值"。怎么补:记住展开规则——a op= b等价于a = a op (b),右侧会作为一个整体先被计算。做几道混合题,比如已知 a = 2、b = 3、c = 4,预测a += b * c;之后 a 的值,答案是 14 而不是 20。这类题只要练过一遍就不会再错。

5.6 循环边界条件差一:能跑但结果不对

易漏点是:while (i <= n)和while (i < n)分不清楚,导致循环多跑一圈或少跑一圈。之所以会漏,是因为初学循环时习惯用自然语言想"i 小于 n",但代码里小于和小于等于只差一个字符,行为差一次迭代。怎么补:写循环时先明确"n 是否必须被处理"。如果从 1 累加到 n,就用i <= n;如果只是从 1 到 n-1,就用i < n。刷题时遇到循环题,第一件事就是在草稿纸上写出 i 的取值序列,比如 i = 1, 2, ..., n,再代入循环体推演。这个习惯能同时解决边界差一和变量追踪两个问题。

6. 编程题实战与查漏补缺:从真题到自查清单

6.1 时间规划:把时间统一成分钟再算差

编程题第一题叫"时间规划",输入开始时刻和结束时刻的时、分共四个整数,输出两个时刻之间的分钟数。题目保证同一天且开始时刻在结束之前,用 24 小时制。核心思路很简单:把时刻统一换算成"从 0 点起的总分钟数",再相减。小时乘以 60 加分钟,得到开始时刻的总分钟数和结束时刻的总分钟数,后者减前者就是答案。

#include <iostream> using namespace std; int main() { int sh, sm, eh, em; cin >> sh >> sm >> eh >> em; int start = sh * 60 + sm; // 开始时刻换算成分钟 int end = eh * 60 + em; // 结束时刻换算成分钟 cout << end - start << endl; return 0; }

这道题之所以是经典,是因为它考察"单位统一"的思维方式。直接拿小时减小时、分钟减分钟会出现借位问题,比如 9:5 到 10:0 这种跨小时的场景,被减数小于减数时要考虑借 1 小时当 60 分钟,容易出错。统一成分钟后就完全没有借位问题。写代码时变量命名建议用带语义的名字,比如sh表示 start hour,sm表示 start minute,这样不容易搞混输入顺序。

对于满分,边界情况也要过一遍:开始时刻是 0 时 0 分,结束时刻是 23 时 59 分,结果应该是 1439 分钟,用这个例子自测可以验证代码没有漏掉边界。另外输入保证开始早于结束,所以不需要处理跨天的情况,但代码里留一个if (end < start)的分支也不多余——万一题目描述变了,程序不会直接输出负数误导你。

6.2 累计相加:先找规律再写循环

第二题叫"累计相加",输入一个正整数 n,输出累计相加的结果。题目描述比较抽象,但样例给得很清楚:n = 3 时输出 10,n = 4 时输出 20,n = 10 时输出 220。反推这个规律会发现,它不是单纯求 1 到 n 的和,而是求"第 i 项等于 1 加到 i"的累加和。也就是:第 1 项是 1,第 2 项是 1 + 2 = 3,第 3 项是 1 + 2 + 3 = 6,第 4 项是 1 + 2 + 3 + 4 = 10,最后把所有项相加。n = 3 时是 1 + 3 + 6 = 10,n = 4 时是 1 + 3 + 6 + 10 = 20,完全匹配样例。

#include <iostream> using namespace std; int main() { int n; cin >> n; int term = 0; // 当前项的累加和,即 1+2+...+i int total = 0; // 所有项的总和 for (int i = 1; i <= n; i++) { term += i; // 第 i 项 = 第 i-1 项 + i total += term; // 累加这一项 } cout << total << endl; return 0; }

代码里两个变量是关键:term是第 i 项的值,total是累计结果。每轮循环先把 i 加进term,得到第 i 项,再加进total。这个两变量滚动累加的模式在编程题里很常见,值得多练几遍。如果第一次写不出来,建议先在纸上列出 i、term、total 三列的表格,手动执行到 n = 4,把 1、3、6、10 和 1、4、10、20 两行数字写出来,循环结构自然就清楚了。

还有一个值得注意的细节:n 最大是 100,累加结果 220 说明规模很小,用 int 完全够。但如果你练的题目把 n 扩大到 10000,total 会快速增长,这时就要考虑会不会溢出。考场上遇到计算规模题,养成估算一下最大结果的习惯,能避免很多隐性 bug。

6.3 考前自查清单与刷题建议

到这里,整份卷子的知识点已经全部过了一遍。最后落一张自查清单,建议考前一周每天花十分钟对照检查,哪一项回答不清楚就回到对应小节去补。

检查项对应考点自测方式
能说出五种设备的输入/输出方向硬件常识随机列举耳机、摄像头等设备判断方向
能说出 '3' 和 3 的类型区别字面量类型手写四个字面量并标出类型
能背出标识符三条规则并构造反例标识符写出 3 个合法标识符和 3 个非法标识符
能说出 endl 为什么不是关键字关键字口头解释关键字与标准库对象的区别
能解释单个等号和双等号的区别赋值与比较写两条 if 语句分别演示错误和正确用法
能不假思索地说出 7 / 2 的结果整数除法口算五个整数除法表达式
能说出 do...while 最少执行几次循环语义口述 while 和 do...while 的区别
能在 5 分钟内写出时间规划题的代码编程实战不看任何资料手写完整代码

刷题方面,建议按"单选题 → 判断题 → 编程题"的顺序复盘,因为判断题的答案比单选题更有复习价值——每个错误选项都可以改写成一个新的判断题。比如选择题里"执行赋值语句后变量的类型可能会变化"是错的,那你就把这句话当成判断题去做,巩固效果更好。

编程题的复盘方式也建议固定:每题先看自己的代码能不能通过样例,再追问一句"如果输入是边界值会怎么样"。时间规划题问 0:0 到 23:59,累计相加题问 n = 1,这两个边界值能暴露大部分逻辑漏洞。从那以后我每次复习真题,都强制自己走一遍"读题 → 写代码 → 跑样例 → 验边界"四步流程,不再直接看题解。这套流程看起来慢,但真正让我在考场上稳住的恰恰是那些被边界检查救下来的细节。希望这份梳理能帮你在考前把知识地图补完整,少走我当时走过的弯路。

本文还有配套的精品资源,点击获取

返回列表