題目 1:C 程序執行入口與結束
題目:一個 C 語言程序是從( )開始,到( )結束
答案:main 函數的開始 (即 main 函數體第一條語句)、**main 函數的結束** (即 main 函數體最後 return 或隱式 return 0;)。
解析:C 程序運行時環境啟動代碼 (crt0 等) 執行初始化後調用 main,main 返回值作為進程退出碼。不是 從文件第一行/第一個函數開始。
題目 2:指針聲明語義辨析
題目:下列語句含義:
| 聲明 | 含義 | 讀法 (右左法則) |
A. int **p; | 指向 int* 的指針 (二級指針) | p 是指針 → 指向指針 → 指向 int |
B. int *p; | 指向 int 的指針 (一級指針) | p 是指針 → 指向 int |
C. int (*p)(); | 指向函數的指針,函數返回 int,參數不定 | p 是指針 → 指向函數 → 返回 int |
D. int *p[]; | 指針數組,元素類型 int* | p 是數組 → 元素是指針 → 指向 int |
右左法則口訣:從變量名出發,先看右邊 ([]/()),再看左邊 (*),循環直到類型關鍵字。
題目 3:if-else 配對原則
題目:C 語言規定,條件語句中 if 與 else 的配對原則是( )
選項:A) 縮排位置相同 B) 其之前最近 C) 其之後最近 D) 同一行上
答案:B) 其之前最近 (else 匹配**最近的、未被匹配的、同一塊作用域內的** if)
示例:
if (a)
if (b) stmt1;
else stmt2; // else 匹配內層 if (b),非外層 if (a)
避坑:始終用大括號 明確作用域,消除歧義。
題目 4:if 條件表達式
題目:if 語句後圓括號中,用以決定分支流程的表達式是( )
答案:標量表達式 (整數/浮點數/指針/算術/關係/邏輯運算組合)。非零為真,零為假。無布爾類型 (C99 前),_Bool/bool (C99/C11) 本質仍是整數。
題目 5:字符串長度與 strlen
題目:char doom[] = "xyz",則數組長度為( ),strlen(doom) = ( )
答案:數組長度 4 (含結束符 '\0'),strlen(doom) = 3 (不含結束符的可見字符數)。
關鍵區別:
sizeof(doom) = 4 (編譯期常量,含 '\0')
strlen(doom) = 3 (運行期計數,遇 '\0' 停止)
- 若
char *p = "xyz",sizeof(p) = 指針大小 (4/8),strlen(p) = 3
題目 6:變量定義合法性
題目:以下定義語句中正確的是( )
| 選項 | 代碼 | 判定 | 原因 |
| A | float *x, y = &a; | ❌ | y 是 float,&a 是地址,類型不匹配;a 未定義 |
| B | float i = j = 10.0; | ❌ | j 未聲明 (C 不支持鏈式聲明初始化) |
| C | int x = 10, *y = &x; | ✅ | x 定義初始化,y 定義為指向 x 的指針,類型完全匹配 |
| D | char i = 'M', j = 'N'; | ✅ | 字符常量賦值給 char,語法正確 (注意中文逗號 , 需改為英文 ,) |
答案:C、D 正確 (若 D 逗號為英文)。
題目 7:合法表達式判斷
題目:若變量 x、y 已正確定義賦值,以下符合語法的表達式是( )
| 選項 | 代碼 | 判定 | 分析 |
| A | ++x, y = x-- | ✅ | 逗號表達式:先 ++x,再 y = x-- (賦值後 x 自減)。整個表達式值為 y = x-- 的結果。語法合法。 |
| B | x + 1 = y | ❌ | 左值必須是可修改的左值,x+1 是右值 (臨時結果),不可賦值。 |
| C | x = x + 10 = x + y | ❌ | 賦值運算符右結合,但 x+10 非左值,無法被賦值。 |
| D | double(x) / 10 | ❌ (C語言) | double(x) 是 C++ 風格函數式轉型,**C 語言無此語法**。C 強制轉型用 (double)x 或 (double)(x)。 |
答案:A 合法。 (若為 C++ 題則 A、D 合法,但題目標明 C 語言)。
題目 8:結構體指針運算 (進階)
題目:有程序段:
struct st { int x; int *y; } *pt;
int a[] = {1,2}, b[] = {3,4};
struct st c[2] = { {10, a}, {20, b} }; // 假設修正初始化
pt = c;
下列表達式值為 11 的是( )
| 選項 | 表達式 | 值 | 分析 |
| A | *pt->y | 1 | pt->y = a (地址),解引用得 a[0]=1 |
| B | pt->x | 10 | 第一個結構體的 x |
| C | ++pt->x | 11 | 前置遞增 pt->x:10→11,值為 11 |
| D | (pt++)->x | 10 | 後置遞增 pt:取值後 pt 指向下一個結構體 |
答案:C。
運算符優先級:-> > ++ (前置) > *。++pt->x 等價 ++(pt->x)。
題目 9:數組名與指針關系
題目:char str[20] = "Program", *p; p = str;,正確敘述是( )
| 選項 | 敘述 | 判定 | 解析 |
| A | *p 與 str[0] 值相等 | ✅ | p = str 即 p = &str[0],*p 即 str[0] = 'P' |
| B | str 與 p 類型完全相同 | ❌ | str 類型 char[20] (數組類型),p 類型 char* (指針類型)。sizeof(str)=20,sizeof(p)=4/8 |
| C | 數組長度與指針指向字符串長度相等 | ❌ | strlen(str)=7,數組長度 20,指針無長度屬性 |
| D | 數組存放內容與指針存放內容相同 | ❌ | 數組存字符序列,指針存首元素地址,內容本質不同 |
答案:A。
總結核心考點
- 程序入口
main,非文件首行
- 指針聲明讀法:右左法則
else 匹配最近未匹配 if — **始終加大括號**
if 判斷非零即真
sizeof (編譯期、含 '\0') vs strlen (運行期、不含 '\0')
- 定義合法性:類型匹配、左值要求、C 風格轉型
(type)expr
- 逗號表達式求值順序、副作用、整體值
- 結構體指針
-> 優先級高於前置 ++
- 數組名 ≠ 指針:類型不同、
sizeof 不同、不可修改、但隱式轉換為首元素地址
- 上一篇文章: C語言函數返回二維數組的正確姿勢:結構體封裝、指針傳遞、動態分配三種方案
- 下一篇文章: C語言未初始化局部變量值分析:為什麼輸出隨機大數而非小數
Copyright ©
程式碼之家 All Rights Reserved