備考全攻略:知識(shí)點(diǎn)地圖與易錯(cuò)點(diǎn)剖析)
簡(jiǎn)介2023年6月GESP C一級(jí)真題文檔面向備戰(zhàn)CCF GESP C一級(jí)考試的考生與信奧賽初學(xué)者內(nèi)容涵蓋單選題、判斷題與編程題三大題型并配有逐題知識(shí)點(diǎn)解析與解題思路。文檔為docx格式整包共1個(gè)文件大小僅71KB無(wú)需安裝額外環(huán)境即可直接打開使用。目前已有1242人學(xué)習(xí)是考前快速熟悉真實(shí)題型與命題風(fēng)格的高性價(jià)比資料。試卷部分完整呈現(xiàn)了真題原貌從計(jì)算機(jī)輸出設(shè)備、ChatGPT能力邊界到常量數(shù)據(jù)類型、C標(biāo)識(shí)符規(guī)則、運(yùn)算符優(yōu)先級(jí)與模運(yùn)算等高頻考點(diǎn)均有涉及解析部分不僅說(shuō)明正確選項(xiàng)還逐個(gè)指出干擾項(xiàng)的錯(cuò)誤原因幫助考生真正理解C語(yǔ)法細(xì)節(jié)。編程題則以“時(shí)間規(guī)劃”“累計(jì)相加”為例演示如何將實(shí)際場(chǎng)景轉(zhuǎn)化為程序邏輯并給出變量定義、分鐘換算、求和模型等分步思路。無(wú)論初次接觸GESP的初學(xué)者還是希望查漏補(bǔ)缺的進(jìn)階學(xué)習(xí)者都能借助這份資料明確考查重點(diǎn)提升應(yīng)試效率。1. GESP C 一級(jí)備考一張知識(shí)地圖先看清考什么GESP 一級(jí)真題的結(jié)構(gòu)非常固定30 分單選題、20 分判斷題、50 分編程題。這三塊對(duì)應(yīng)三種完全不同的能力——單選考認(rèn)得出硬件常識(shí)、語(yǔ)言細(xì)節(jié)判斷考拎得清概念邊界和反例編程考寫得對(duì)把文字描述翻譯成可運(yùn)行代碼。這張地圖先立起來(lái)后續(xù)所有復(fù)習(xí)模塊都掛在上面硬件與類型系統(tǒng)、表達(dá)式與運(yùn)算符、流程控制然后是高頻易錯(cuò)點(diǎn)最后落到編程題實(shí)戰(zhàn)。它適合剛學(xué)完 C 基礎(chǔ)、想用真題檢驗(yàn)自己的初學(xué)者也適合考前急需定位薄弱環(huán)節(jié)的備考生。按模塊過(guò)一遍比盲目刷題高效得多因?yàn)檫@份卷子的考點(diǎn)重復(fù)率很高摸清規(guī)律后很多題就是換皮不換核。2. 硬件常識(shí)與語(yǔ)言基礎(chǔ)輸出設(shè)備、數(shù)據(jù)類型、標(biāo)識(shí)符規(guī)則2.1 輸出設(shè)備判定與硬件框架第一道單選就考輸出設(shè)備四個(gè)選項(xiàng)里麥克風(fēng)、音箱、打印機(jī)、顯示器只有一個(gè)是異類。麥克風(fēng)接收聲波并轉(zhuǎn)換成電信號(hào)送進(jìn)計(jì)算機(jī)屬于輸入設(shè)備音箱把電信號(hào)還原成聲音送到人耳是輸出設(shè)備打印機(jī)和顯示器都屬于輸出設(shè)備。這里每年都有人選錯(cuò)因?yàn)槠綍r(shí)說(shuō)話時(shí)麥克風(fēng)出聲造成了錯(cuò)覺(jué)——判斷輸入還是輸出標(biāo)準(zhǔn)只有一個(gè)看數(shù)據(jù)流向。數(shù)據(jù)從外部進(jìn)計(jì)算機(jī)就是輸入從計(jì)算機(jī)流向外部就是輸出。用這個(gè)標(biāo)準(zhǔn)去套耳機(jī)既是輸入又是輸出但一級(jí)默認(rèn)按輸出講、攝像頭輸入、掃描儀輸入、投影儀輸出比死記設(shè)備清單穩(wěn)妥得多。判斷題第一題考計(jì)算機(jī)硬件五大部件運(yùn)算器、控制器、存儲(chǔ)器、輸入設(shè)備和輸出設(shè)備這是最基礎(chǔ)的框架題。運(yùn)算器和控制器合起來(lái)構(gòu)成 CPU存儲(chǔ)器分內(nèi)存和外存——硬盤也屬于存儲(chǔ)器。這個(gè)框架能幫你把很多零散題目歸位第一道單選考的是輸入輸出設(shè)備這一支判斷題第 1 題考的是整個(gè)五大部件的完整羅列兩道題其實(shí)都在同一個(gè)知識(shí)樹上。判斷題第二題涉及中國(guó)計(jì)算機(jī)發(fā)展史國(guó)產(chǎn)第一臺(tái)通用數(shù)字電子計(jì)算機(jī)誕生于 1958 年比美國(guó) 1946 年誕生的第一臺(tái)通用電子計(jì)算機(jī)晚了十多年。這道題表面考?xì)v史年份實(shí)際上考的是通用數(shù)字電子計(jì)算機(jī)這個(gè)限定詞——早期有些電子計(jì)算機(jī)只能做特定計(jì)算不能算通用。理解通用與專用的差別比死背年份更關(guān)鍵。這類帶年份的題目復(fù)習(xí)時(shí)整理成一條時(shí)間線即可不必深挖。還有一道題是問(wèn)聊天機(jī)器人程序不能完成哪個(gè)任務(wù)。選項(xiàng)是改郵件、編劇本、擦地板、寫代碼——前三個(gè)都是文本生成類工作唯獨(dú)擦地板屬于物理世界操作。這道題考的是對(duì)話式 AI 的能力邊界它能處理數(shù)字化信息不能直接操作物理世界。答題邏輯就是排除法找出那個(gè)不屬于信息處理的選項(xiàng)。這類題目近年出現(xiàn)頻率不低本質(zhì)考的是程序能處理什么的邊界意識(shí)和編程本身關(guān)系不大。2.2 常量、變量與類型系統(tǒng)常量 3 的數(shù)據(jù)類型是 char這道題的正確率常年不高因?yàn)槌鯇W(xué)者習(xí)慣把 3 看成數(shù)字 3。帶單引號(hào)的字符字面量在 C 里就是 char 類型哪怕這個(gè)字符長(zhǎng)得像數(shù)字。不帶引號(hào)的 3 是 int3.0 是 double3.0f 是 float。梳理下來(lái)會(huì)發(fā)現(xiàn)這道題其實(shí)在考字面量的書寫形式?jīng)Q定類型——你寫出來(lái)是什么樣子編譯器就按什么類型去理解這一點(diǎn)比背誦類型定義有用得多。變量那道題把四個(gè)最容易混淆的表述放在一起。A 說(shuō)變量可以沒(méi)有定義——錯(cuò)C 要求先定義后使用。B 說(shuō)對(duì)一個(gè)沒(méi)有定義的變量賦值相當(dāng)于定義了一個(gè)新變量——錯(cuò)這會(huì)導(dǎo)致編譯錯(cuò)誤或未定義行為。C 說(shuō)執(zhí)行賦值語(yǔ)句后變量的類型可能會(huì)變化——錯(cuò)變量的類型在定義那一刻就固定了賦值只能改值不能改類型。D 說(shuō)執(zhí)行賦值語(yǔ)句后變量的值可能不會(huì)變化——對(duì)給變量賦一個(gè)和當(dāng)前值相同的值值確實(shí)不變。這道題提醒我們復(fù)習(xí)變量時(shí)要把定義、聲明、賦值三件事分開理解定義是為變量分配空間并確定類型賦值只是往這個(gè)空間里寫值。判斷題里10 是一個(gè) int 類型常量是對(duì)的這正好和 3 是 char 湊成一對(duì)建議放在一起復(fù)習(xí)。另一道判斷題說(shuō)計(jì)算結(jié)果必須存儲(chǔ)在變量中才能輸出這是錯(cuò)的——cout a b;直接輸出表達(dá)式結(jié)果完全合法表達(dá)式本身就是有值的不需要先存進(jìn)變量。初學(xué)者寫代碼時(shí)習(xí)慣多定義一個(gè)變量再輸出雖然不影響程序正確性但說(shuō)明對(duì)表達(dá)式可以直接作為輸出參數(shù)這個(gè)事實(shí)不夠篤定。2.3 標(biāo)識(shí)符、關(guān)鍵字與邊界案例標(biāo)識(shí)符規(guī)則只有三條只能由字母、數(shù)字、下劃線組成不能以數(shù)字開頭不能是關(guān)鍵字。真題里那個(gè)很長(zhǎng)的標(biāo)識(shí)符number_of_Chinese_people_in_millions就是沖著規(guī)則去的——由字母和下劃線組成以字母開頭不是關(guān)鍵字完全合法。360AntiVirus非法是因?yàn)閿?shù)字開頭ManWoman非法是因?yàn)椴辉诤戏ㄗ址颾reak非法是因?yàn)樗顷P(guān)鍵字。最容易翻車的是判斷題里那句標(biāo)識(shí)符的命名不能完全由數(shù)字組成至少有一個(gè)字母就可以。這個(gè)表述把規(guī)則歪曲成了至少含一個(gè)字母但真正的規(guī)則是不能以數(shù)字開頭。按至少有一個(gè)字母的標(biāo)準(zhǔn)1abc應(yīng)該合法但它以數(shù)字開頭實(shí)際非法。反過(guò)來(lái)_123不含任何字母理論上也能作標(biāo)識(shí)符盡管不推薦。所以這道題是錯(cuò)的錯(cuò)在把不能以數(shù)字開頭錯(cuò)誤地等同于至少有一個(gè)字母。復(fù)習(xí)時(shí)建議自己構(gòu)造幾個(gè)邊界例子_123、1a、a1、a_b2把合法和非法的邊界徹底搞清楚。關(guān)鍵字那道題double、else、while都是 C 關(guān)鍵字只有endl不是。endl是標(biāo)準(zhǔn)庫(kù)提供的一個(gè)流操作符對(duì)象負(fù)責(zé)輸出換行并刷新緩沖區(qū)它不屬于語(yǔ)言關(guān)鍵字。這里要建立一個(gè)意識(shí)關(guān)鍵字是語(yǔ)言語(yǔ)法的一部分標(biāo)準(zhǔn)庫(kù)里的名字不是關(guān)鍵字。同樣的例子還有cout、cin、string、vector——它們都在std命名空間里。這個(gè)區(qū)分在后續(xù)學(xué)習(xí)里會(huì)反復(fù)出現(xiàn)一級(jí)階段先記住endl不是關(guān)鍵字就夠用了。3. 表達(dá)式與運(yùn)算符賦值、算術(shù)與邏輯的最容易失分區(qū)3.1 賦值語(yǔ)句的左值約束真題問(wèn)哪個(gè)語(yǔ)句不符合 C 語(yǔ)法正確選項(xiàng)是a c b c。這個(gè)寫法在數(shù)學(xué)里說(shuō)得通但 C 里的賦值號(hào)左邊必須是一個(gè)可修改的左值a c是一個(gè)表達(dá)式不是一個(gè)變量不能被賦值。這就是賦值語(yǔ)句的第一條硬語(yǔ)法左側(cè)必須是變量。同題的其他三個(gè)選項(xiàng)都很有深意。a (b c)合法因?yàn)?b c)的結(jié)果是布爾值賦給int變量a時(shí)會(huì)被自動(dòng)轉(zhuǎn)換成 0 或 1。b 5.5合法但發(fā)生精度丟失——double的 5.5 賦給int會(huì)截?cái)喑?5這在后面整數(shù)除法相關(guān)題目里是同一個(gè)原理。c a b c合法C 的賦值語(yǔ)義是先完整算出右側(cè)表達(dá)式的值再執(zhí)行賦值所以不會(huì)出現(xiàn)c 被覆蓋導(dǎo)致求和錯(cuò)誤的錯(cuò)覺(jué)。這三條合在一起幾乎覆蓋了一級(jí)考試關(guān)于賦值語(yǔ)句的全部考點(diǎn)。另外判斷題里有一道如果 a 和 b 為 int 類型的變量則表達(dá)式 a b 可以判斷 a 和 b 是否相等答案是錯(cuò)。a b是賦值把 b 的值寫進(jìn) a返回值是 a 的新值判斷相等要用a b。這個(gè)錯(cuò)誤極其常見尤其是剛從數(shù)學(xué)思維轉(zhuǎn)過(guò)來(lái)的人看到等號(hào)就覺(jué)得是等于。寫代碼時(shí)如果發(fā)現(xiàn)邏輯判斷不生效先檢查是不是把寫成了——這是 C 里出現(xiàn)頻率最高的低級(jí)錯(cuò)誤之一幾乎每個(gè)初學(xué)者都踩過(guò)。3.2 整數(shù)除法與浮點(diǎn)運(yùn)算的混用如果 a 和 b 是 int 類型值分別為 7 和 2問(wèn)哪個(gè)表達(dá)式結(jié)果不是 3.5。四個(gè)選項(xiàng)是0.0 a / b、(a 0.0) / b、(0.0 a) / b、a / (0.0 b)。答案是0.0 a / b因?yàn)檫\(yùn)算符優(yōu)先級(jí)里除法先于加法a / b先被計(jì)算兩個(gè) int 相除執(zhí)行整數(shù)除法結(jié)果是 3 而不是 3.5然后0.0 3得到 3.0。其余三個(gè)表達(dá)式都是把0.0放在分子或分母里讓除法在 double 域內(nèi)執(zhí)行結(jié)果自然是 3.5。這個(gè)考點(diǎn)背后的機(jī)制只有一句話只要參與運(yùn)算的兩個(gè)操作數(shù)都是整數(shù)除法就按整數(shù)除法執(zhí)行小數(shù)部分直接截?cái)嘀灰幸粋€(gè)是浮點(diǎn)類型整個(gè)除法就按浮點(diǎn)運(yùn)算執(zhí)行。這個(gè)規(guī)則在編程題里也會(huì)出現(xiàn)比如計(jì)算時(shí)間差時(shí)如果先做整數(shù)除法再做乘法很容易把中間結(jié)果截掉。建議把 7 / 2、7.0 / 2、7 / 2.0、0.0 7 / 2 四個(gè)表達(dá)式親手跑一遍感受一下混用浮點(diǎn)帶來(lái)的差異。判斷題里表達(dá)式 (37 / 4) 的計(jì)算結(jié)果為 9且結(jié)果類型為 int也是同一個(gè)考點(diǎn)。37 除以 4 的數(shù)學(xué)結(jié)果是 9.25但兩個(gè) int 相除直接截?cái)喑?9類型為 int。這道題在判斷題里屬于送分題前提是你在復(fù)習(xí)時(shí)沒(méi)有跳過(guò)整數(shù)除法要截?cái)噙@個(gè)細(xì)節(jié)。另一個(gè)容易漏的點(diǎn)是截?cái)嗪退纳嵛迦胧莾苫厥隆行┏鯇W(xué)者以為37 / 4會(huì)算成 9四舍五入恰好也是 9換個(gè)例子37 / 5就會(huì)露餡結(jié)果是 7 而不是四舍五入的 7。3.3 復(fù)合賦值、邏輯表達(dá)式與運(yùn)算符優(yōu)先級(jí)a % 4等價(jià)于a a % 4如果 a 是 6那結(jié)果就是 2。這道題沒(méi)有任何陷阱唯一要確認(rèn)的是復(fù)合賦值運(yùn)算符的展開語(yǔ)義先把右側(cè)表達(dá)式整體求值再和左側(cè)變量做對(duì)應(yīng)運(yùn)算。同類運(yùn)算符還有、-、*、/建議在復(fù)習(xí)時(shí)把五個(gè)放在一起過(guò)一遍重點(diǎn)注意a / b時(shí)如果 a、b 都是 int結(jié)果是截?cái)嗪蟮恼麛?shù)。邏輯判斷那道題很經(jīng)典判斷 a 等于 0 且 b 等于 0。A 選項(xiàng)(a b 0)是專門設(shè)置的陷阱——是左結(jié)合的(a b)先被計(jì)算結(jié)果是布爾值 true 或 false然后這個(gè)布爾值再和 0 比較。當(dāng) a 和 b 都是 0 時(shí)a b為 trueint 值是 11 0 為 false整個(gè)表達(dá)式反而判不出兩個(gè)都是 0。C 選項(xiàng)(a b 0)也不行a 1、b -1 時(shí)和為 0 但兩個(gè)都不是 0。D 選項(xiàng)(a 0) (b 0)的結(jié)果是 int 2不是布爾值也不能作為且的判斷。正確答案是 B!(a || b)當(dāng) a 和 b 都為 0 時(shí)a || b為 false取非要它變成 true。這道題的教訓(xùn)是C 的邏輯表達(dá)式和數(shù)學(xué)表達(dá)式長(zhǎng)得像但語(yǔ)義完全不同尤其是的左結(jié)合性帶來(lái)的連鎖比較陷阱。復(fù)習(xí)時(shí)建議特意練幾道把數(shù)學(xué)判斷翻譯成 C 表達(dá)式的題比如判斷三個(gè)數(shù)是否相等、判斷三個(gè)數(shù)是否都為正數(shù)練完再回去看這種題會(huì)輕松很多。另外選擇題里還有一道算術(shù)混合題(4 * (11 12) / 4)的計(jì)算結(jié)果。注意乘除是從左到右依次執(zhí)行的4 乘以 23 得到 92除以 4 得到 23。如果括號(hào)位置換一下變成4 * ((11 12) / 4)結(jié)果就是 4 * 5 20因?yàn)槔ㄌ?hào)里的整數(shù)除法先截?cái)喑?5。這類題不需要背優(yōu)先級(jí)表只需要記住兩點(diǎn)括號(hào)最高乘除和加減各自從左到右整數(shù)除法會(huì)截?cái)唷?记鞍堰@四個(gè)小規(guī)則過(guò)一遍就夠。4. 流程控制與程序行為分支、循環(huán)與整體輸出4.1 分支結(jié)構(gòu)與 do...while 的執(zhí)行語(yǔ)義判斷題里if 語(yǔ)句可以沒(méi)有 else 子句是對(duì)的。if 單獨(dú)使用完全合法else 是可選部分。這個(gè)結(jié)論看似簡(jiǎn)單但后續(xù)學(xué)習(xí)里會(huì)出現(xiàn)一個(gè)衍生考點(diǎn)else 與最近的 if 配對(duì)。遇到嵌套 if 時(shí)要特別注意括號(hào)否則會(huì)出現(xiàn)else 掛錯(cuò) if的經(jīng)典錯(cuò)誤。一級(jí)階段不需要寫很深的嵌套但建議在練習(xí)時(shí)故意把 if else 寫成不縮進(jìn)的樣式強(qiáng)迫自己靠括號(hào)判斷配對(duì)關(guān)系。判斷題里do...while 語(yǔ)句的循環(huán)體至少會(huì)執(zhí)行一次也是對(duì)的。這涉及 do...while 和 while 的根本區(qū)別do...while 先執(zhí)行循環(huán)體再判斷條件所以無(wú)論條件是否成立循環(huán)體至少被執(zhí)行為一次while 先判斷再執(zhí)行條件一開始為 false 就一次都不執(zhí)行。這個(gè)區(qū)別是流程控制部分最重要的考點(diǎn)之一做題時(shí)看到 do...while 就默認(rèn)至少執(zhí)行一次再去推后續(xù)邏輯。這兩種結(jié)構(gòu)對(duì)應(yīng)的常見考法是給一段短代碼判斷某個(gè)變量在循環(huán)結(jié)束后的值。這類題最容易在循環(huán)邊界上出錯(cuò)比如while (i 10)和while (i 10)的循環(huán)次數(shù)就不同。建議復(fù)習(xí)時(shí)把循環(huán)區(qū)間當(dāng)成專門的訓(xùn)練點(diǎn)小于、小于等于、大于、大于等于四種邊界各寫一個(gè)例子跑一遍確認(rèn)結(jié)果。4.2 循環(huán)與取模的組合推理題真題里有一道代碼填空要求輸出147。已知選項(xiàng)是i % 2 1、i % 3 1、i i 3、i 3可以推斷出代碼結(jié)構(gòu)大致是循環(huán)內(nèi)先判斷一個(gè)條件滿足才輸出 i 的值。輸出序列 1、4、7 對(duì)應(yīng) i 取 1、4、7 時(shí)刻這三個(gè)數(shù)模 3 都余 1所以正確選項(xiàng)是i % 3 1。如果是取模 2序列會(huì)是 1、3、5 這種奇數(shù)序列和 1、4、7 不匹配。這類循環(huán) 取模組合題是一級(jí)考試的??捅澈蟮倪壿嬍侨∧_\(yùn)算能把一維的循環(huán)序列映射成周期性序列從而篩選出符合某種余數(shù)條件的數(shù)。復(fù)習(xí)時(shí)建議自己寫一個(gè)循環(huán)依次輸出 i 從 1 到 10 時(shí)i % 2、i % 3的值把余數(shù)周期這個(gè)直覺(jué)建立起來(lái)。另一種變體是i i 3這種步長(zhǎng)型選項(xiàng)和取模篩選很相似區(qū)別在于步長(zhǎng)型是直接控制 i 的取值序列取模篩選是 i 正常遞增但通過(guò)條件決定是否輸出。做題時(shí)先看代碼里 i 是怎么變的再判斷選項(xiàng)對(duì)輸出序列的影響。還有一道考執(zhí)行程序后輸出結(jié)果的題四個(gè)選項(xiàng)是 63、98、113、無(wú)法確定。這類題沒(méi)有給出完整程序代碼但從選項(xiàng)能看出來(lái)它考的是對(duì)循環(huán)變量在程序執(zhí)行過(guò)程中變化的追蹤能力。做題方法是逐行推演用草稿紙列一個(gè)表每行記錄當(dāng)前循環(huán)變量、累加變量、輸出變量三個(gè)值模擬每一步變化。整個(gè)過(guò)程很像手動(dòng)執(zhí)行一遍程序雖然費(fèi)一點(diǎn)時(shí)間但準(zhǔn)確率最高。特別要注意循環(huán)的進(jìn)入條件和退出條件如果循環(huán)條件依賴于某個(gè)運(yùn)行時(shí)輸入且題目沒(méi)有給出輸入值那答案選無(wú)法確定的概率就很高。4.3 程序行為題的標(biāo)準(zhǔn)分析方法程序行為題給代碼求輸出在單選和判斷里都會(huì)出現(xiàn)它不需要你寫代碼但需要你在紙上推演。推演有個(gè)固定套路先圈出所有變量聲明確認(rèn)每個(gè)變量的類型再找到循環(huán)或分支的邊界條件然后逐行執(zhí)行每次變量變化都記錄最新值。這里面最值得警惕的是變量類型導(dǎo)致的隱性變化。比如某個(gè)變量是 int中間被賦了一個(gè)浮點(diǎn)數(shù)表達(dá)式的結(jié)果值會(huì)被截?cái)噙@會(huì)影響后續(xù)所有計(jì)算。另一個(gè)常見陷阱是循環(huán)體內(nèi)的賦值語(yǔ)句改變了判斷條件里用到的變量導(dǎo)致循環(huán)次數(shù)和直觀預(yù)期不一致。這時(shí)候不要在腦子里感覺(jué)循環(huán)會(huì)執(zhí)行幾次老老實(shí)實(shí)走一遍草稿紙推演??紙?chǎng)上時(shí)間充裕這類題只要耐心推演就一定能做對(duì)丟分通常是因?yàn)閳D快跳步。5. 易漏點(diǎn)排查六個(gè)最容易丟分的細(xì)節(jié)復(fù)習(xí)完前面四個(gè)模塊如果只是把概念看了一遍就上考場(chǎng)最容易在下面這些細(xì)節(jié)上翻車。它們不是獨(dú)立的知識(shí)點(diǎn)而是藏在各個(gè)模塊縫隙里的坑整理成清單逐條過(guò)一遍效果最好。5.1 未定義變量直接賦值編譯錯(cuò)誤而非新變量易漏點(diǎn)是對(duì)沒(méi)有定義的變量賦值以為會(huì)自動(dòng)定義一個(gè)新變量。之所以會(huì)漏是因?yàn)?Python 等腳本語(yǔ)言允許這種寫法帶著這個(gè)習(xí)慣來(lái)寫 C 就會(huì)踩坑。怎么補(bǔ)在編輯器里輸入未定義變量會(huì)立刻看到編譯錯(cuò)誤平時(shí)寫練習(xí)時(shí)不要把錯(cuò)誤提示關(guān)掉刻意讓編譯器來(lái)抓你幾次印象就深刻了。C 的規(guī)則是先定義后使用定義語(yǔ)句確定了變量的名字和類型之后才能對(duì)它賦值。5.2 賦值號(hào)當(dāng)作等號(hào)用判斷邏輯被悄悄改寫易漏點(diǎn)是寫完if (a b)還以為自己在判斷 a 是否等于 b。之所以會(huì)漏是因?yàn)閿?shù)學(xué)里等號(hào)的含義太根深蒂固看到單個(gè)等號(hào)就自動(dòng)翻譯成等于。怎么補(bǔ)寫判斷條件時(shí)強(qiáng)制寫成b a這種把常量放左邊的風(fēng)格一旦誤寫成b a編譯器會(huì)給出警告更重要的是養(yǎng)成寫完條件后回頭掃一眼的習(xí)慣專門找if (后面的單個(gè)等號(hào)。這個(gè)錯(cuò)誤在考試?yán)锊粫?huì)讓你編譯但會(huì)在判斷題和代碼分析題里反復(fù)出現(xiàn)把賦值語(yǔ)句返回新值這個(gè)特性記住就能識(shí)別出這類陷阱。5.3 整數(shù)除法截?cái)?.5 變成 3 的無(wú)聲事故易漏點(diǎn)是兩個(gè) int 相除時(shí)忽略了截?cái)鄬?dǎo)致后續(xù)計(jì)算結(jié)果偏差。之所以會(huì)漏是因?yàn)閿?shù)學(xué)里除法的結(jié)果是一個(gè)精確的數(shù)而 C 的整數(shù)除法只保留整數(shù)部分。怎么補(bǔ)在任何涉及除法的地方先問(wèn)自己兩個(gè)操作數(shù)是不是都是 int。如果希望保留小數(shù)至少把其中一個(gè)操作數(shù)改成浮點(diǎn)形式比如a * 1.0 / b或(double)a / b。做題時(shí)看到 7 / 2、37 / 4 這類表達(dá)式先在草稿紙上寫清楚結(jié)果是 3 和 9不是 3.5 和 9.25。5.4 判斷偶數(shù)用錯(cuò)取模條件a % 4 2 不是偶數(shù)判斷易漏點(diǎn)是用a % 4 2判斷偶數(shù)還覺(jué)得挺有道理。之所以會(huì)漏是因?yàn)槿∧_\(yùn)算練得少對(duì)模 2 才是奇偶判斷這個(gè)結(jié)論不夠敏感。怎么補(bǔ)把 % 2 的兩個(gè)分支寫死在筆記里——a % 2 0是偶數(shù)a % 2 1是奇數(shù)。遇到任何判斷題只要出現(xiàn)判斷偶數(shù)的字樣直接鎖定模 2不要被其他模數(shù)干擾。真題里那道判斷題就是專門考這個(gè)正確表述是a % 2 0a % 4 2只能說(shuō)明 a 除以 4 余 2比如 6、10、14它們確實(shí)都是偶數(shù)但這個(gè)條件會(huì)漏掉 2、4、8 這些偶數(shù)所以不是有效的偶數(shù)判斷。5.5 復(fù)合賦值展開時(shí)忘記右側(cè)先求值易漏點(diǎn)是把a(bǔ) b * c理解成先算 a b 再乘 c。之所以會(huì)漏是因?yàn)閺?fù)合賦值運(yùn)算符的展開語(yǔ)義和直觀理解有偏差沒(méi)有意識(shí)到右側(cè)是整體先求值。怎么補(bǔ)記住展開規(guī)則——a op b等價(jià)于a a op (b)右側(cè)會(huì)作為一個(gè)整體先被計(jì)算。做幾道混合題比如已知 a 2、b 3、c 4預(yù)測(cè)a b * c;之后 a 的值答案是 14 而不是 20。這類題只要練過(guò)一遍就不會(huì)再錯(cuò)。5.6 循環(huán)邊界條件差一能跑但結(jié)果不對(duì)易漏點(diǎn)是while (i n)和while (i n)分不清楚導(dǎo)致循環(huán)多跑一圈或少跑一圈。之所以會(huì)漏是因?yàn)槌鯇W(xué)循環(huán)時(shí)習(xí)慣用自然語(yǔ)言想i 小于 n但代碼里小于和小于等于只差一個(gè)字符行為差一次迭代。怎么補(bǔ)寫循環(huán)時(shí)先明確n 是否必須被處理。如果從 1 累加到 n就用i n如果只是從 1 到 n-1就用i n。刷題時(shí)遇到循環(huán)題第一件事就是在草稿紙上寫出 i 的取值序列比如 i 1, 2, ..., n再代入循環(huán)體推演。這個(gè)習(xí)慣能同時(shí)解決邊界差一和變量追蹤兩個(gè)問(wèn)題。6. 編程題實(shí)戰(zhàn)與查漏補(bǔ)缺從真題到自查清單6.1 時(shí)間規(guī)劃把時(shí)間統(tǒng)一成分鐘再算差編程題第一題叫時(shí)間規(guī)劃輸入開始時(shí)刻和結(jié)束時(shí)刻的時(shí)、分共四個(gè)整數(shù)輸出兩個(gè)時(shí)刻之間的分鐘數(shù)。題目保證同一天且開始時(shí)刻在結(jié)束之前用 24 小時(shí)制。核心思路很簡(jiǎn)單把時(shí)刻統(tǒng)一換算成從 0 點(diǎn)起的總分鐘數(shù)再相減。小時(shí)乘以 60 加分鐘得到開始時(shí)刻的總分鐘數(shù)和結(jié)束時(shí)刻的總分鐘數(shù)后者減前者就是答案。#include iostream using namespace std; int main() { int sh, sm, eh, em; cin sh sm eh em; int start sh * 60 sm; // 開始時(shí)刻換算成分鐘 int end eh * 60 em; // 結(jié)束時(shí)刻換算成分鐘 cout end - start endl; return 0; }這道題之所以是經(jīng)典是因?yàn)樗疾靻挝唤y(tǒng)一的思維方式。直接拿小時(shí)減小時(shí)、分鐘減分鐘會(huì)出現(xiàn)借位問(wèn)題比如 9:5 到 10:0 這種跨小時(shí)的場(chǎng)景被減數(shù)小于減數(shù)時(shí)要考慮借 1 小時(shí)當(dāng) 60 分鐘容易出錯(cuò)。統(tǒng)一成分鐘后就完全沒(méi)有借位問(wèn)題。寫代碼時(shí)變量命名建議用帶語(yǔ)義的名字比如sh表示 start hoursm表示 start minute這樣不容易搞混輸入順序。對(duì)于滿分邊界情況也要過(guò)一遍開始時(shí)刻是 0 時(shí) 0 分結(jié)束時(shí)刻是 23 時(shí) 59 分結(jié)果應(yīng)該是 1439 分鐘用這個(gè)例子自測(cè)可以驗(yàn)證代碼沒(méi)有漏掉邊界。另外輸入保證開始早于結(jié)束所以不需要處理跨天的情況但代碼里留一個(gè)if (end start)的分支也不多余——萬(wàn)一題目描述變了程序不會(huì)直接輸出負(fù)數(shù)誤導(dǎo)你。6.2 累計(jì)相加先找規(guī)律再寫循環(huán)第二題叫累計(jì)相加輸入一個(gè)正整數(shù) n輸出累計(jì)相加的結(jié)果。題目描述比較抽象但樣例給得很清楚n 3 時(shí)輸出 10n 4 時(shí)輸出 20n 10 時(shí)輸出 220。反推這個(gè)規(guī)律會(huì)發(fā)現(xiàn)它不是單純求 1 到 n 的和而是求第 i 項(xiàng)等于 1 加到 i的累加和。也就是第 1 項(xiàng)是 1第 2 項(xiàng)是 1 2 3第 3 項(xiàng)是 1 2 3 6第 4 項(xiàng)是 1 2 3 4 10最后把所有項(xiàng)相加。n 3 時(shí)是 1 3 6 10n 4 時(shí)是 1 3 6 10 20完全匹配樣例。#include iostream using namespace std; int main() { int n; cin n; int term 0; // 當(dāng)前項(xiàng)的累加和即 12...i int total 0; // 所有項(xiàng)的總和 for (int i 1; i n; i) { term i; // 第 i 項(xiàng) 第 i-1 項(xiàng) i total term; // 累加這一項(xiàng) } cout total endl; return 0; }代碼里兩個(gè)變量是關(guān)鍵term是第 i 項(xiàng)的值total是累計(jì)結(jié)果。每輪循環(huán)先把 i 加進(jìn)term得到第 i 項(xiàng)再加進(jìn)total。這個(gè)兩變量滾動(dòng)累加的模式在編程題里很常見值得多練幾遍。如果第一次寫不出來(lái)建議先在紙上列出 i、term、total 三列的表格手動(dòng)執(zhí)行到 n 4把 1、3、6、10 和 1、4、10、20 兩行數(shù)字寫出來(lái)循環(huán)結(jié)構(gòu)自然就清楚了。還有一個(gè)值得注意的細(xì)節(jié)n 最大是 100累加結(jié)果 220 說(shuō)明規(guī)模很小用 int 完全夠。但如果你練的題目把 n 擴(kuò)大到 10000total 會(huì)快速增長(zhǎng)這時(shí)就要考慮會(huì)不會(huì)溢出??紙?chǎng)上遇到計(jì)算規(guī)模題養(yǎng)成估算一下最大結(jié)果的習(xí)慣能避免很多隱性 bug。6.3 考前自查清單與刷題建議到這里整份卷子的知識(shí)點(diǎn)已經(jīng)全部過(guò)了一遍。最后落一張自查清單建議考前一周每天花十分鐘對(duì)照檢查哪一項(xiàng)回答不清楚就回到對(duì)應(yīng)小節(jié)去補(bǔ)。檢查項(xiàng)對(duì)應(yīng)考點(diǎn)自測(cè)方式能說(shuō)出五種設(shè)備的輸入/輸出方向硬件常識(shí)隨機(jī)列舉耳機(jī)、攝像頭等設(shè)備判斷方向能說(shuō)出 3 和 3 的類型區(qū)別字面量類型手寫四個(gè)字面量并標(biāo)出類型能背出標(biāo)識(shí)符三條規(guī)則并構(gòu)造反例標(biāo)識(shí)符寫出 3 個(gè)合法標(biāo)識(shí)符和 3 個(gè)非法標(biāo)識(shí)符能說(shuō)出 endl 為什么不是關(guān)鍵字關(guān)鍵字口頭解釋關(guān)鍵字與標(biāo)準(zhǔn)庫(kù)對(duì)象的區(qū)別能解釋單個(gè)等號(hào)和雙等號(hào)的區(qū)別賦值與比較寫兩條 if 語(yǔ)句分別演示錯(cuò)誤和正確用法能不假思索地說(shuō)出 7 / 2 的結(jié)果整數(shù)除法口算五個(gè)整數(shù)除法表達(dá)式能說(shuō)出 do...while 最少執(zhí)行幾次循環(huán)語(yǔ)義口述 while 和 do...while 的區(qū)別能在 5 分鐘內(nèi)寫出時(shí)間規(guī)劃題的代碼編程實(shí)戰(zhàn)不看任何資料手寫完整代碼刷題方面建議按單選題 → 判斷題 → 編程題的順序復(fù)盤因?yàn)榕袛囝}的答案比單選題更有復(fù)習(xí)價(jià)值——每個(gè)錯(cuò)誤選項(xiàng)都可以改寫成一個(gè)新的判斷題。比如選擇題里執(zhí)行賦值語(yǔ)句后變量的類型可能會(huì)變化是錯(cuò)的那你就把這句話當(dāng)成判斷題去做鞏固效果更好。編程題的復(fù)盤方式也建議固定每題先看自己的代碼能不能通過(guò)樣例再追問(wèn)一句如果輸入是邊界值會(huì)怎么樣。時(shí)間規(guī)劃題問(wèn) 0:0 到 23:59累計(jì)相加題問(wèn) n 1這兩個(gè)邊界值能暴露大部分邏輯漏洞。從那以后我每次復(fù)習(xí)真題都強(qiáng)制自己走一遍讀題 → 寫代碼 → 跑樣例 → 驗(yàn)邊界四步流程不再直接看題解。這套流程看起來(lái)慢但真正讓我在考場(chǎng)上穩(wěn)住的恰恰是那些被邊界檢查救下來(lái)的細(xì)節(jié)。希望這份梳理能幫你在考前把知識(shí)地圖補(bǔ)完整少走我當(dāng)時(shí)走過(guò)的彎路。本文還有配套的精品資源點(diǎn)擊獲取