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

C語言基礎知識點精選測試題詳解:程序結構、指針、條件語句、數組與字符串

     編輯:C 語言問答

題目 1:C 程序執行入口與結束

題目:一個 C 語言程序是從( )開始,到( )結束

答案:main 函數的開始 (即 main 函數體第一條語句)、**main 函數的結束** (即 main 函數體最後 return 或隱式 return 0;)。

解析:C 程序運行時環境啟動代碼 (crt0 等) 執行初始化後調用 main,main 返回值作為進程退出碼。不是 從文件第一行/第一個函數開始。

題目 2:指針聲明語義辨析

題目:下列語句含義:

右左法則口訣:從變量名出發,先看右邊 ([]/()),再看左邊 (*),循環直到類型關鍵字。

題目 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. int **p;指向 int* 的指針 (二級指針)p 是指針 → 指向指針 → 指向 int
B. int *p;指向 int 的指針 (一級指針)p 是指針 → 指向 int
C. int (*p)();指向函數的指針,函數返回 int,參數不定p 是指針 → 指向函數 → 返回 int
D. int *p[];指針數組,元素類型 int*p 是數組 → 元素是指針 → 指向 int

答案:C、D 正確 (若 D 逗號為英文)。

題目 7:合法表達式判斷

題目:若變量 x、y 已正確定義賦值,以下符合語法的表達式是( )

選項代碼判定原因
Afloat *x, y = &a;❌y 是 float,&a 是地址,類型不匹配;a 未定義
Bfloat i = j = 10.0;❌j 未聲明 (C 不支持鏈式聲明初始化)
Cint x = 10, *y = &x;✅x 定義初始化,y 定義為指向 x 的指針,類型完全匹配
Dchar i = 'M', j = 'N';✅字符常量賦值給 char,語法正確 (注意中文逗號 , 需改為英文 ,)

答案: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++x, y = x--✅逗號表達式:先 ++x,再 y = x-- (賦值後 x 自減)。整個表達式值為 y = x-- 的結果。語法合法。
Bx + 1 = y❌左值必須是可修改的左值,x+1 是右值 (臨時結果),不可賦值。
Cx = x + 10 = x + y❌賦值運算符右結合,但 x+10 非左值,無法被賦值。
Ddouble(x) / 10❌ (C語言)double(x) 是 C++ 風格函數式轉型,**C 語言無此語法**。C 強制轉型用 (double)x 或 (double)(x)。

答案:C。
運算符優先級:-> > ++ (前置) > *。++pt->x 等價 ++(pt->x)。

題目 9:數組名與指針關系

題目:char str[20] = "Program", *p; p = str;,正確敘述是( )

選項表達式值分析
A*pt->y1pt->y = a (地址),解引用得 a[0]=1
Bpt->x10第一個結構體的 x
C++pt->x11前置遞增 pt->x:10→11,值為 11
D(pt++)->x10後置遞增 pt:取值後 pt 指向下一個結構體

答案:A。

總結核心考點

  1. 程序入口 main,非文件首行
  2. 指針聲明讀法:右左法則
  3. else 匹配最近未匹配 if — **始終加大括號**
  4. if 判斷非零即真
  5. sizeof (編譯期、含 '\0') vs strlen (運行期、不含 '\0')
  6. 定義合法性:類型匹配、左值要求、C 風格轉型 (type)expr
  7. 逗號表達式求值順序、副作用、整體值
  8. 結構體指針 -> 優先級高於前置 ++
  9. 數組名 ≠ 指針:類型不同、sizeof 不同、不可修改、但隱式轉換為首元素地址
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
選項敘述判定解析
A*p 與 str[0] 值相等✅p = str 即 p = &str[0],*p 即 str[0] = 'P'
Bstr 與 p 類型完全相同❌str 類型 char[20] (數組類型),p 類型 char* (指針類型)。sizeof(str)=20,sizeof(p)=4/8
C數組長度與指針指向字符串長度相等❌strlen(str)=7,數組長度 20,指針無長度屬性
D數組存放內容與指針存放內容相同❌數組存字符序列,指針存首元素地址,內容本質不同