選項:
int x[][3] = {0}; ✅ 合法:行數由初始化列表推導 (1 行),列數固定 3,全 0 初始化int x[2][3] = {{1,2},{3,4},{5,6}}; ❌ **錯誤**:聲明 2 行,卻提供 3 行初始化列表 → **行數越界**int x[][3] = {{1,2,3},{4,5,6}}; ✅ 合法:2 行 3 列,行數自動推導為 2int x[2][3] = {1,2,3,4,5,6}; ✅ 合法:按行優先順序填充,正好 6 個元素答案:B。核心考點:**初始化列表行數不能超過聲明行數**。
選項:
main(); { ... } ❌ main 後有分號 → 空函數體,大括號成獨立代碼塊main() { /* / programming / */ printf(...); } ✅ 正確:註釋合法、主函數無分號、大括號匹配main() { /* / programming*/ */ ... } ❌ 註釋嵌套錯誤:/* ... */ 不可嵌套,內部 */ 過早結束include <stdio.h> ❌ 缺 #,預處理指令無效答案:B。考點:main 無分號、註釋不嵌套、預處理 # 必須。原題答案標 B 但解析寫 B,實為 B 正確。
條件:float x=1.5; int a=1,b=3,c=2;
switch(x) { case 1.0: ... } ❌ **控制表達式必須為整數類型**,float 非法switch((int)x); { ... } ❌ switch 後有分號 → 無語句體,大括號成獨立塊switch(a+b) { case 1: ... case 2+1: ... } ✅ 合法:a+b 為 int,case 2+1 常量表達式編譯期求值為 3switch(a+b) { case 1: ... case c: ... } ❌ case 標籤必須為**整數常量表達式**,變量 c 非法答案:C。核心:**switch 控制量必為整型,case 標籤必為整型常量表達式 (可含運算但無變量)**。
選項 (假設 fun 返回 float):
main() { x=fun(2,10); } float fun(int a,int b) { ... } ❌ **調用前無聲明**,C89 隱式聲明返回 int 導致類型不匹配,C99+ 非法float fun(int a,int b) { ... } main() { x=fun(i,j); } ✅ 定義在調用前,隱含聲明float fun(int,int); main() { x=fun(2,10); } float fun(int a,int b) { ... } ✅ 原型聲明在前,調用合法main() { float fun(int,int); x=fun(i,j); } float fun(int a,int b) { ... } ✅ 函數原型聲明在塊內 (作用域至塊末),調用合法答案:A 錯誤。最佳實踐:**頭文件聲明、源文件定義、調用前可見聲明**。
選項:
while( (ch=getchar()) != 'N') printf("%c",ch); ✅ 正確:賦值結果參與比較,非 'N' 打印while(ch=getchar() != 'N') printf("%c",ch); ❌ 運算符優先級:!= 高於 =,等價 ch = (getchar() != 'N'),ch 變為 0/1while(ch=getchar() == 'N') printf("%c",ch); ❌ 同 B,且邏輯反了while((ch=getchar()) == 'N') printf("%c",ch); ❌ 邏輯反:讀到 'N' 才打印,題目要求讀到 'N' 結束答案:A。關鍵:**括號確保賦值先於比較**,ch 保存字符值而非邏輯值。
代碼:int fun(int *p) { return *p; }
選項:A) 不確定值 B) 一個整數 C) 形參 p 中存放的值 D) 形參 p 的地址值
答案:B) 一個整數 (亦即 C 的含義)。
解析:p 是指向 int 的指針 (存放地址),*p 解引用得到該地址處的 int 值,**返回的是整數值**。選項 C「形參 p 中存放的值」即地址值,非 返回值。返回值是 *p 所指向的內容。
代碼:double *p, a;
*p = &a; scanf("%lf", p); ❌ *p 是 double,&a 是地址,類型不匹配*p = &a; scanf("%f", p); ❌ 同 A,且 %f 對應 float*,double* 需 %lfp = &a; scanf("%lf", *p); ❌ *p 是 double 值,scanf 需地址p = &a; scanf("%lf", p); ✅ p 指向 a,%lf 匹配 double*,地址類型完全正確答案:D。核心:scanf 參數**必須是地址**,double* 用 %lf,float* 用 %f。
代碼:struct st { int x; int *y; } *pt; int a[]={1,2}, b[]={3,4}; struct st c[2] = { {10,a}, {20,b} }; pt=c;
選項:A) *pt->y B) pt->x C) ++pt->x D) (pt++)->x
*pt->y = *a = 1pt->x = 10++pt->x:-> 優先級高於前置 ++,等價 ++(pt->x),x 10→11,**值為 11** ✅(pt++)->x:後置 ++,取值後 pt 移動,值為 10答案:C。運算符優先級:**後置 ++/-- > 前置 ++/--/*/& > ->/.** (實際 -> 最高,但結合性致使 ++pt->x 解析為 ++(pt->x))。
代碼:char str[20]="Program", *p; p=str;
*p 與 str[0] 值相等 ✅ p=str 隱式轉換為 &str[0],*p 即 str[0] = 'P'char[20] vs char*strlen),指針無長度答案:A。核心:**數組名在表達式中 (除 sizeof/&/_Alignof) 隱式轉換為首元素地址**。
main 無分號、註釋不嵌套、#includeswitch 整型控制量、case 整型常量表達式while 賦值比較括號、getchar 返回 int 配合 EOF*p 取值、p 存地址、scanf 傳地址-> 優先級高、前置 ++ 返回新值、後置返回舊值sizeof、可修改性、隱式轉換規則