
簡介這份PTA理論考復(fù)習資料以Word文檔形式整理了HW02、HW03等章節(jié)的判斷題與參考答案覆蓋C語言基礎(chǔ)語法、編譯預(yù)處理命令、main函數(shù)作用、變量內(nèi)存分配、單目/雙目運算符、賦值與算術(shù)優(yōu)先級、scanf/printf格式控制以及for循環(huán)求和、階乘等高頻考點適合正在刷PTA平臺理論題、需要快速核對答案并理解易錯知識點的初學者。資源包共包含1個docx文檔約345KB輕量便攜支持在Word中按關(guān)鍵詞定位查找題目與答案解析。目前已有1895人學習使用。文檔后半部分還附有詳細知識點講解針對整數(shù)除法、浮點數(shù)取模、scanf讀取格式、空語句與復(fù)合語句等常見陷阱逐條辨析可幫助讀者在刷題之外系統(tǒng)梳理C語言核心概念有效減少理論考失分點。1. 考前刷 PTA 理論題這份 docx 就是現(xiàn)成的 C 語言判斷題錯題本期末前一周群里最熱鬧的永遠是“PTA 上 1-14 這道題選 T 還是 F”“1-17 的代碼為什么運行結(jié)果和我手算的不一樣”。判斷題看著只有兩個選項實際每一道都在摳語法細節(jié)先聲明后使用、整數(shù)除法截斷、%f 與 %lf 的類型匹配任何一個知識點沒記牢就是五五開靠猜。這份“PTA理論考部分.docx”把高頻判斷題和選擇題按題號整理在一起題目、代碼片段、T/F 選項都在同一個文檔里適合兩類人一類是剛開始刷 C 語言題、需要一份帶答案的題集逐題對照另一類是考前突擊用題號快速鎖定自己沒掌握的知識點。它不是教材但比教材更接近考場的問法。2. 考點地圖這份題集覆蓋的六類高頻判斷題先把文檔里的題按考點歸類你會發(fā)現(xiàn) PTA 理論考的出題套路非常固定翻來覆去就是程序結(jié)構(gòu)、變量與表達式、運算符、格式化輸入輸出、循環(huán)、分支與字符這幾塊。下面這張表是我按題號整理出來的考點分布方便你拿到文檔后直接對號入座。考點類別典型題號核心判斷依據(jù)預(yù)處理與程序結(jié)構(gòu)1-3、1-5、1-6、1-7include 不加分號程序從 main 開始變量聲明與表達式1-10、1-11、1-12、1-13、1-14先聲明后使用% 只作用于整型運算符與自增1-17、1-18、1-14(HW03)賦值優(yōu)先級低于算術(shù)i 會改變原值格式化輸入輸出1-7、1-8、1-9、1-11格式串與變量類型必須一一匹配for 循環(huán)1-15、1-16、1-21 至 1-24、4-2表達式 1 只執(zhí)行一次注意初始化字符與 ASCII1-10 至 1-24(HW04)ASCII 碼順序、大小寫差 32switch 分支1-27 至 1-33、2-5 至 2-9case 必須常量無 break 會穿透2.1 程序結(jié)構(gòu)三連問預(yù)處理、main 函數(shù)、執(zhí)行起點第一類題基本送分但錯的人最多的是 1-3 這道#include stdio.h; // 這是編譯預(yù)處理命令題目問這句話對不對答案是 F。#include是預(yù)處理指令不是普通 C 語句末尾不能加分號。實際寫代碼時你在 VS Code 里按分號編譯器通常會警告甚至報錯PTA 理論考就是把這些細節(jié)單獨拎出來問你。類似的還有 1-5“任何一個程序都必須有而且只能有一個 main() 函數(shù)”這是對的1-6“C 語言程序是從源文件的第一條語句開始執(zhí)行的”這是錯的執(zhí)行永遠從 main 函數(shù)的第一條語句開始源文件里 main 之前的全局聲明和宏定義都不算執(zhí)行語句哪怕 main 寫在文件最后也一樣。判斷這類題有個通用技巧看到“第一條語句”“只能有一個”“必須”這類絕對化表述先想有沒有例外。main 函數(shù)確實只能有一個這是標準規(guī)定的但“從第一條語句開始執(zhí)行”這個說法默認了第一條語句在 main 里而源文件開頭往往是#include和宏定義所以是錯的。2.2 變量與表達式合法性先聲明再使用是底線1-10 這道題給了一個反直覺的片段很多人第一眼看覺得沒毛病k 1; int k;答案是 F不符合 C 語言語法。C 語言要求變量先聲明后使用這里先把 1 賦給一個不存在的變量聲明放在后面毫無意義編譯直接報“未聲明的標識符”。這類題在 PTA 里反復(fù)出現(xiàn)換了個馬甲而已有時候把int k;放到k 1;后面有時候用int x, y;然后寫x y 22;。后者同樣是 F因為賦值號左邊必須是一個左值表達式x y不是變量不能作為賦值目標。1-12 說“單目運算符需要 2 個操作數(shù)”一眼假。單目就是你只有一個數(shù)比如i、-x、!flag雙目才是兩個比如a b。1-14 說double x時x % 2符合語法這是經(jīng)典陷阱。%是取余運算符C 語言明確規(guī)定只能用于整型操作數(shù)對double用%編譯直接報錯。做題時看到浮點數(shù)和%同框不用猶豫直接選 F。2.3 運算符優(yōu)先級賦值表達式本身有值這是最大的坑HW03 里的 1-4題干給了這么一段if (x 20) { y 1; } else { y 0; }問執(zhí)行后 x 的值變不變。答案是 Fx 的值會變而且這個 if 條件永遠為真。原因在于x 20不是比較是賦值表達式這個表達式的值就是 20非零即為真else 分支永遠不會執(zhí)行。你以為是在判斷 x 是否等于 20實際是在給 x 賦值的途中順手做了個條件判斷。原始題 1-18 還說了一件事“假設(shè)賦值運算符的優(yōu)先級比算術(shù)運算符高執(zhí)行int n; n 10 2;后 n 的值為 10?!边@句話也是 F。不是結(jié)果算不對而是“假設(shè)”本身就是錯的C 語言里賦值優(yōu)先級低于算術(shù)所以n 10 2是先算10 2得到 12再賦給 n。PTA 經(jīng)常用這種錯誤假設(shè)來釣魚看到“假設(shè)”兩個字就要警覺按真實標準判斷別順著它的假設(shè)往下想。2.4 printf/scanf 格式串類型對不上輸出全亂格式化輸入輸出是這套題里翻車率最高的部分尤其 1-7、1-8、1-9 三道連在一起// 1-7double x; scanf(%d, x); 輸入 10輸出 10.00 double x; scanf(%d, x); printf(%.2f, x);答案是 F。%d期望一個int*你給了double*scanf 會按 int 的大小把數(shù)據(jù)寫到 x 的前半段內(nèi)存里double 的高位字節(jié)是隨機值輸出大概率不是 10.00。1-8 把格式串換成%f同樣不對%f對應(yīng)的是float*類型不匹配是未定義行為。1-9 更狠scanf(x%lf, x);如果輸入只是30沒有x前綴scanf 匹配失敗x 根本沒被賦值。要想成功必須輸入x30才行。格式串里的普通字符必須原樣匹配輸入這不是描述是匹配規(guī)則。1-11 給的是格式串順序和變量不對應(yīng)int money, year; double rate; scanf(%d %lf %d , money, year, rate);答案是 F。變量順序是 money、year、rate格式串順序卻是%d %lf %d第二個%lf會讀到 year 的地址上第三個%d讀到 rate 的地址上整型和浮點全亂套了。記憶方法很簡單scanf 的參數(shù)從第二個開始必須和格式串里的轉(zhuǎn)換說明從左到右一一對應(yīng)類型也要匹配差一個都不行。2.5 for 循環(huán)執(zhí)行次數(shù)邊界、初始化、類型三個變量一起看1-21 到 1-24 是循環(huán)題的重災(zāi)區(qū)先看 1-21int i, sum; for (i 1; i 10; i) { sum sum i; }題目說 sum 的值是 55答案是 F。理由很直接sum 沒初始化初始值是不確定的通常默認 0但標準不保證拿不確定的值去累加結(jié)果無法判斷。你可能會說“運行起來就是 55”但理論考考的是語言標準不是某臺機器的運行結(jié)果。1-22 的階乘題同理int i; double product; product 0; for (i 1; i 20; i) { product product * i; }答案是 F。product 初始值為 00 乘任何數(shù)都等于 0算出來是 0 而不是 20 的階乘。這就是典型的“看著像階乘實際是零乘法”。4-2 是計算執(zhí)行次數(shù)的大題題干代碼很經(jīng)典int fahr; double celsius; for (fahr 91; fahr 100; fahr) celsius 5.0 * (fahr - 32) / 9.0; // 語句① printf(%4d%6.1f\n, fahr, celsius); // 語句②語句①執(zhí)行 10 次fahr 從 91 到 100語句②執(zhí)行 1 次循環(huán)體共執(zhí)行 10 次循環(huán)結(jié)束時 fahr 的值是 101。最后一點是高頻考點for 循環(huán)結(jié)束后控制變量停在第一個不滿足條件的位置也就是 101。很多人填 100那是循環(huán)最后一次執(zhí)行時的值不是結(jié)束后的值。2.6 ASCII 碼順序與 switch 語法記憶要精確到差值字符類的判斷題核心就兩個記憶錨點一是大小寫字母 ASCII 差 32二是數(shù)字字符按升序連續(xù)排列。文檔里有道題問“數(shù)字字符 1 的值就是數(shù)字 1”答案是 F1 的 ASCII 碼是 49和數(shù)字 1 差了十萬八千里。還有“大寫字母 M 的 ASCII 碼比小寫字母 m 大”這也是 F大寫字母統(tǒng)一比小寫小 32M 是 77m 是 109。switch 的語法坑集中在 1-28 到 1-33。case 常量表達式的值不能相同1-28 說“可以相同”選 Fdefault 必須使用1-29 選 Fdefault 是可選的不是必須的1-30 更典型switch(choice) { case choice 1: price 3.0; break; }答案是 F。case 后面必須是整型常量表達式像choice 1這種比較表達式是運行期才能確定的值編譯器不認。后面 1-32“case 語句后如沒有 break順序向下執(zhí)行”是對的這就是 switch 的穿透規(guī)則實際開發(fā)里漏寫 break 導(dǎo)致的 bug在理論題里反而是考點。3. 把易錯題拆開看賦值、除法和格式串的四個雷區(qū)第 2 章把考點過了一遍這一章挑四個最容易被誤判的題目類型深入拆解每一類都配有反例和調(diào)試思路。你會發(fā)現(xiàn) PTA 判斷題的 T/F 背后考察的是 C 語言規(guī)范里幾個很具體的邊界條件。3.1 if(x 20)賦值表達式當條件永遠為真這道題值得反復(fù)說因為選擇題里出現(xiàn)過判斷題里也出現(xiàn)過。if (x 20)在 C 語言里完全合法它做兩件事先把 20 賦給 x然后判斷這個賦值表達式的值也就是 20是否為真。非零即為真所以 if 分支必然執(zhí)行。#include stdio.h int main(void) { int x 5; if (x 20) { // 注意是單等號不是雙等號 printf(always true\n); } else { printf(never here\n); } printf(x %d\n, x); // 輸出 x 20 return 0; }邏輯說明第 4 行的x 20是賦值表達式不是比較所以 else 分支不可達x 從 5 被改成 20。PTA 原題說“x 的值不變”顯然錯誤。參數(shù)說明如果你本來想比較必須寫成if (x 20)。我一般建議在代碼里用“常量放左邊”的寫法if (20 x)這樣萬一少寫一個等號變成20 x編譯器直接報錯不會留到運行期才暴露問題。3.2 整數(shù)除法 1/n絕對值大于 1 時恒為 0前提是 int1-15 說“若變量定義為 int n當 n 的絕對值大于 1 時表達式 1/n 的值恒為 0”這個說法本身是對的。C 語言里兩個整數(shù)相除結(jié)果還是整數(shù)小數(shù)部分直接截斷1/2得 01/(-2)也等于 0向零取整。真正坑人的是 1-23 和 1-24 這類把整型除法和浮點初始化混在一起的題// 1-24int i; double sum; sum 0; int i; double sum; sum 0; for (i 2; i 4; i i 2) { sum sum 1/i; }題目說 sum 的值是 0.75實際是 0。原因在1/ii 是 int1/i按整數(shù)除法計算i2 時結(jié)果是 0i4 時結(jié)果也是 0累加了兩次 0。想得到 0.75 必須寫1.0/i把其中一個操作數(shù)變成 double才會觸發(fā)浮點除法。判斷這類題時先問自己一句除法兩邊是不是都是整型只要都是整型結(jié)果就不可能帶小數(shù)。3.3 scanf 格式串是精確匹配不是描述scanf(x%lf, x)這道題值得單獨拉出來講因為它考察的是 scanf 的一個冷門行為格式串里的普通字符必須與輸入字符逐個精確匹配。double x; scanf(x%lf, x); printf(%.2f, x);如果運行時光標閃動你直接輸入30回車scanf 發(fā)現(xiàn)第一個字符不是x立即停止匹配返回值是 0x 沒有被賦值。只有輸入x30這種帶前綴的形式x匹配成功%lf才能讀到 30。很多人寫代碼時喜歡在格式串里加提示前綴比如scanf(請輸入%lf, x)這在實際程序里會造成輸入負擔PTA 理論題考的就是這個行為差異格式串里寫了什么用戶就必須輸入什么。3.4 switch 無 break穿透的執(zhí)行順序選擇題 2-9 是 switch 穿透的經(jīng)典題#include stdio.h int main(void) { int x 1, a 0, b 0; switch(x) { case 0: b; case 1: a; case 2: a; b; } printf(a%d,b%d\n, a, b); return 0; }邏輯說明x 的值是 1程序從case 1進入執(zhí)行a使 a 變成 1因為沒有 break繼續(xù)向下穿透到case 2執(zhí)行a; b;a 變 2b 變 1。最終輸出a2,b1對應(yīng)選項 A。參數(shù)說明每個 case 后面如果沒有 break執(zhí)行流會一直往下走直到遇到 break 或者 switch 結(jié)束。判斷題 1-32 說“case 語句后如沒有 break順序向下執(zhí)行”就是對的。實際開發(fā)里忘記 break 產(chǎn)生的 bug在理論題里反而是需要你選 T 的正向考點。4. 把判斷題改造成選擇題三遍刷題法這一章講方法。文檔里的判斷題只有 T/F 兩個選項但你可以自己做二次加工把它們變成帶解析的選擇題這個過程本身就是高效的復(fù)習。4.1 找反例判斷題的 T 必須“無條件成立”判斷一個命題對不對最有效的方法是嘗試找反例反例找不到就先存疑。比如 1-13 說若變量定義為 int fahr則 5(fahr-32)/9 是符合 C 語言語法的表達式這里的反例是語法層面的5(fahr-32)缺少乘號數(shù)字和括號之間必須有運算符所以這個表達式連編譯都過不了直接選 F。再比如 1-14 的double x; x % 2反例就是 C 語言規(guī)范里 % 只接受整型。找反例的過程比題目本身有價值因為考試時你記不住所有規(guī)范但能記住幾個典型反例。表格式地整理你的反例庫會更清晰題號命題內(nèi)容反例/理由結(jié)論1-3include 后帶分號預(yù)處理指令不是語句無分號F1-135(fahr-32)/9缺乘法運算符F1-14double 用 %取余只用于整型F1-21sum 未初始化為 55未定義行為F4.2 三遍刷題法原卷、錯題、復(fù)述我拿到這類題集的標準做法是分三輪過不要第一遍直接對著答案看。第一輪先自測打開文檔拿一張紙遮住右側(cè)答案列如果答案在題后就遮住那一行逐題給出 T/F 判斷做完再揭開對照。這一輪的作用是暴露問題不要在意正確率。第二輪只做錯題把做錯的題號單獨整理到一個新文檔里每題寫下三句話——正確結(jié)論是什么、為什么這么判斷、我當時錯選了什么。這個復(fù)述過程比二刷錯題本身有效因為你在強迫自己把模糊記憶變成語言輸出。第三輪考前快速過只看錯題整理不看原題。準備一個 python 腳本把 docx 里的題號提取出來按題號排序生成一個空表方便做標記import re with open(PTA理論考部分.docx, r, encodingutf-8) as f: content f.read() # 提取 1-3 2-1 這類題號 issue_ids re.findall(r\b(\d-\d)\b, content) unique_ids sorted(set(issue_ids), keylambda x: int(x.split(-)[0])) for idx in unique_ids: print(f| {idx} | 對/錯 | 錯因 |)邏輯說明正則\d-\d匹配的是文檔里的題號模式比如 1-3、2-1。set去重后按專題序號排序輸出成一個 Markdown 表格骨架你只需要在第二列填判斷結(jié)果、第三列填錯因。參數(shù)說明如果你的 docx 是二進制格式普通open讀不了可以先另存為.txt再用上面的腳本也可以用更省事的辦法直接在 Word 里把全選內(nèi)容粘貼到文本編輯器再跑。4.3 統(tǒng)計錯題主題按頻次決定復(fù)習順序三遍刷完之后把錯題按第 2 章的考點分類統(tǒng)計大概率會發(fā)現(xiàn)錯題集中在某一兩個類別。我見過最多的兩類一類是格式化輸入輸出的格式串匹配另一類是整數(shù)除法與浮點除法的混用。這兩個主題在 PTA 判斷題里出現(xiàn)的密度很高而且容易互相糾纏。按頻次排序復(fù)習優(yōu)先解決錯得最多的主題比從頭到尾平均用力效率高得多。5. 避坑與排查這份題集里最容易誤判的四個細節(jié)使用這份 docx 的過程中有幾個實際問題不是題目本身造成的而是文檔形式和做題習慣帶來的。列出來給你提個醒。5.1 現(xiàn)象答案就印在題后自測時被眼睛提前劇透第二行就是 “T F”你讀題的時候余光已經(jīng)掃到了答案大腦會無意識地傾向那個選項自測結(jié)果失真。原因文檔為了讓讀者方便對照把 T/F 選項直接放在題干后面這是它的優(yōu)點也是自測時的干擾源。解決第一遍自測時把每一題的 T/F 區(qū)域用不透明紙條遮住只露出題干文字全部做完再統(tǒng)一揭開核對。或者另存一個副本用 Word 的查找替換把T和F批量替換成空格生成一份純題干燥版。5.2 現(xiàn)象題干里帶“假設(shè)”二字的題順著假設(shè)想就錯了1-18 假設(shè)賦值運算符優(yōu)先級比算術(shù)運算符高1-11 假設(shè)輸入1001 3 0.025輸出符不符合預(yù)期部分人看到熟悉的情境就放松警惕直接按直覺選。原因出題人用“假設(shè)”構(gòu)造了一個與 C 標準相悖的前提目的是考察你是否真正理解標準本身而不是考察你能不能按題干的設(shè)定推演。解決看到“假設(shè)”先停一下把題干假設(shè)放一邊按 C 語言的真實規(guī)則重新分析。如果真實規(guī)則下題干的設(shè)定不成立那么它想讓你選的那個“正確”結(jié)果其實就是錯誤答案。5.3 現(xiàn)象手算輸出與題目答案對不上懷疑自己算錯比如 1-24 手算1/2 1/4感覺是 0.75題目選 F怎么也想不通。原因忽略了整數(shù)除法。1/2在 C 語言里不是 0.5 而是 0兩個 int 相除結(jié)果直接截斷。這題有雙重陷阱sum 是 double 沒用因為被除式本身是整型運算。解決手算 C 表達式時先畫類型標注。把每個運算數(shù)的類型標在表達式下面除法兩邊都是整型就標“整除”有浮點就標“浮除”。這題一標注就能看出來1/i是整除。5.4 現(xiàn)象選擇題 2-2 的四個選項長得幾乎一樣選不出來選項 B 和 D 只差一個初始化位置或者只有類型不同逐行對比眼花。原因PTA 選擇題的干擾項通常只改一個點改初始化值、改變量類型、改格式串前綴考的是細粒度記憶。解決四選項對比時逐個檢查三個維度。第一維是變量類型int 還是 double第二維是初始化是 0 還是 1第三維是運算寫法1.0/i還是1/i。三個維度都對了才是正確答案。6. 把 docx 變成個人速查表題號索引、錯題復(fù)述與最后一晚復(fù)習文檔的價值不只在第一遍刷題把它加工成適合自己復(fù)習的形態(tài)才是這份資源真正發(fā)揮作用的時刻。我習慣把這份 docx 拆成三份使用。原始文檔保留用于逐題精讀第二個副本提取題號生成速查表每行只留題號、考點、結(jié)論三列作為考前一天快速掃讀的清單第三個副本專門整理錯題格式是“題號 正確結(jié)論 我當時的錯誤判斷 一句話解釋”用于考前一晚重點看。第三份不用長三五十行足夠因為 PPT 上反復(fù)錯的點就那么幾個比如 scanf 格式串匹配、整數(shù)除法截斷、switch 穿透。制作速查表時我把每道題的判斷依據(jù)壓縮成一個短語比如 1-3 寫“include 后不加分號”1-14 寫“% 只能用于整型”1-21 寫“sum 未初始化”。這些短語不是題目答案而是我自己對這個考點的記憶鉤子看到短語能想起完整推理過程才算真記住。最后一晚的復(fù)習順序也有講究。我一般先看速查表快速過一遍全部考點然后只看錯題復(fù)述最后找一張白紙把每個考點的關(guān)鍵規(guī)則默寫一遍。默寫不需要完整句子寫關(guān)鍵詞比如“printf 查類型”“for 結(jié)束值看第一個不滿足條件的位置”。這個動作能把短期記憶錨定到長期區(qū)域考試時遇到同類判斷題會迅速反應(yīng)出來。這套流程看起來簡單但每一輪都在做同一件事把被動的看題變成主動的復(fù)述。從那以后我每次考前都強制走一遍三遍刷題法第一遍暴露問題第二遍解決錯題第三遍只看自己寫過的關(guān)鍵詞而不是盯著原文反復(fù)背。別低估這一遍一遍過篩子的過程它比多刷十道新題更管用。希望幫到你。本文還有配套的精品資源點擊獲取