首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言經典選擇題深度解析:數組定義、程序規範、switch語句、函數聲明、while循環、指針操作

     編輯:C 語言問答

題目 1:二維數組定義錯誤識別

選項:

  • A. int x[][3] = {0}; ✅ 合法:行數由初始化列表推導 (1 行),列數固定 3,全 0 初始化
  • B. int x[2][3] = {{1,2},{3,4},{5,6}}; ❌ **錯誤**:聲明 2 行,卻提供 3 行初始化列表 → **行數越界**
  • C. int x[][3] = {{1,2,3},{4,5,6}}; ✅ 合法:2 行 3 列,行數自動推導為 2
  • D. int x[2][3] = {1,2,3,4,5,6}; ✅ 合法:按行優先順序填充,正好 6 個元素

答案:B。核心考點:**初始化列表行數不能超過聲明行數**。

題目 2:完整正確程序識別

選項:

  • A. main(); { ... } ❌ main 後有分號 → 空函數體,大括號成獨立代碼塊
  • B. main() { /* / programming / */ printf(...); } ✅ 正確:註釋合法、主函數無分號、大括號匹配
  • C. main() { /* / programming*/ */ ... } ❌ 註釋嵌套錯誤:/* ... */ 不可嵌套,內部 */ 過早結束
  • D. include <stdio.h> ❌ 缺 #,預處理指令無效

答案:B。考點:main 無分號、註釋不嵌套、預處理 # 必須。原題答案標 B 但解析寫 B,實為 B 正確。

題目 3:switch 語句合法性

條件:float x=1.5; int a=1,b=3,c=2;

  • A. switch(x) { case 1.0: ... } ❌ **控制表達式必須為整數類型**,float 非法
  • B. switch((int)x); { ... } ❌ switch 後有分號 → 無語句體,大括號成獨立塊
  • C. switch(a+b) { case 1: ... case 2+1: ... } ✅ 合法:a+b 為 int,case 2+1 常量表達式編譯期求值為 3
  • D. switch(a+b) { case 1: ... case c: ... } ❌ case 標籤必須為**整數常量表達式**,變量 c 非法

答案:C。核心:**switch 控制量必為整型,case 標籤必為整型常量表達式 (可含運算但無變量)**。

題目 4:函數聲明/定義/調用順序

選項 (假設 fun 返回 float):

  • A. main() { x=fun(2,10); } float fun(int a,int b) { ... } ❌ **調用前無聲明**,C89 隱式聲明返回 int 導致類型不匹配,C99+ 非法
  • B. float fun(int a,int b) { ... } main() { x=fun(i,j); } ✅ 定義在調用前,隱含聲明
  • C. float fun(int,int); main() { x=fun(2,10); } float fun(int a,int b) { ... } ✅ 原型聲明在前,調用合法
  • D. main() { float fun(int,int); x=fun(i,j); } float fun(int a,int b) { ... } ✅ 函數原型聲明在塊內 (作用域至塊末),調用合法

答案:A 錯誤。最佳實踐:**頭文件聲明、源文件定義、調用前可見聲明**。

題目 5:while 循環讀字符直到 'N'

選項:

  • A. while( (ch=getchar()) != 'N') printf("%c",ch); ✅ 正確:賦值結果參與比較,非 'N' 打印
  • B. while(ch=getchar() != 'N') printf("%c",ch); ❌ 運算符優先級:!= 高於 =,等價 ch = (getchar() != 'N'),ch 變為 0/1
  • C. while(ch=getchar() == 'N') printf("%c",ch); ❌ 同 B,且邏輯反了
  • D. while((ch=getchar()) == 'N') printf("%c",ch); ❌ 邏輯反:讀到 'N' 才打印,題目要求讀到 'N' 結束

答案:A。關鍵:**括號確保賦值先於比較**,ch 保存字符值而非邏輯值。

題目 6:指針函數返回值

代碼:int fun(int *p) { return *p; }

選項:A) 不確定值 B) 一個整數 C) 形參 p 中存放的值 D) 形參 p 的地址值

答案:B) 一個整數 (亦即 C 的含義)。
解析:p 是指向 int 的指針 (存放地址),*p 解引用得到該地址處的 int 值,**返回的是整數值**。選項 C「形參 p 中存放的值」即地址值,非 返回值。返回值是 *p 所指向的內容。

題目 7:scanf 讀 double 指針

代碼:double *p, a;

  • A. *p = &a; scanf("%lf", p); ❌ *p 是 double,&a 是地址,類型不匹配
  • B. *p = &a; scanf("%f", p); ❌ 同 A,且 %f 對應 float*,double* 需 %lf
  • C. p = &a; scanf("%lf", *p); ❌ *p 是 double 值,scanf 需地址
  • D. p = &a; scanf("%lf", p); ✅ p 指向 a,%lf 匹配 double*,地址類型完全正確

答案:D。核心:scanf 參數**必須是地址**,double* 用 %lf,float* 用 %f。

題目 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;

選項:A) *pt->y B) pt->x C) ++pt->x D) (pt++)->x

  • A. *pt->y = *a = 1
  • B. pt->x = 10
  • C. ++pt->x:-> 優先級高於前置 ++,等價 ++(pt->x),x 10→11,**值為 11** ✅
  • D. (pt++)->x:後置 ++,取值後 pt 移動,值為 10

答案:C。運算符優先級:**後置 ++/-- > 前置 ++/--/*/& > ->/.** (實際 -> 最高,但結合性致使 ++pt->x 解析為 ++(pt->x))。

題目 9:數組名與指針賦值

代碼:char str[20]="Program", *p; p=str;

  • A. *p 與 str[0] 值相等 ✅ p=str 隱式轉換為 &str[0],*p 即 str[0] = 'P'
  • B. 類型完全相同 ❌ char[20] vs char*
  • C. 長度相等 ❌ 數組長度 20,字符串長度 7 (strlen),指針無長度
  • D. 存放內容相同 ❌ 數組存字符,指針存地址

答案:A。核心:**數組名在表達式中 (除 sizeof/&/_Alignof) 隱式轉換為首元素地址**。

總結高頻考點

  1. 二維數組初始化行數匹配
  2. main 無分號、註釋不嵌套、#include
  3. switch 整型控制量、case 整型常量表達式
  4. 函數調用前必有聲明 (頭文件最佳)
  5. while 賦值比較括號、getchar 返回 int 配合 EOF
  6. 指針解引用 *p 取值、p 存地址、scanf 傳地址
  7. -> 優先級高、前置 ++ 返回新值、後置返回舊值
  8. 數組名 ≠ 指針:類型、sizeof、可修改性、隱式轉換規則
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved