C語言基礎

以追蹤短程式碼的三選一題型學習C語言:整數型別的大小與固定寬度整數型別、整數提升與有號/無號的轉換、運算子優先順序、位元運算、switch敘述、傳值與指標、static變數、陣列與指標運算、字串與sizeof、const、函式指標、malloc、free與記憶體洩漏、懸置指標、緩衝區溢位、結構的填充、聯合與端序、位元欄位、巨集與條件編譯、volatile,以及未定義行為。

練習10題從本領域隨機抽取10題 · 約5分鐘 練習這個領域以隨機順序出題,涵蓋這個領域的所有題目 弱項題目只重做最近答錯的題目

C語言基礎的重點

C語言至今仍廣泛用於作業系統、裝置驅動程式、微控制器韌體等貼近硬體的軟體。它能直接處理記憶體位址、寫出快速的程式碼,但也有許多不知道就難以察覺錯誤的規則,例如 int 的大小因處理系統而異、計算途中型別會改變、寫入超過陣列範圍也不會停止等。

本單元以追蹤短程式碼實際執行時之輸出的題目為主,學習整數型別的大小與 stdint.h 的固定寬度整數型別、整數除法、整數提升與有號/無號的比較、運算子優先順序、位元運算、短路求值、switch 敘述的貫穿、傳值與傳指標、static 變數與生命週期、指標運算與陣列、二維陣列的排列、字串與 strlen、sizeof、const 的加法,以及函式指標。接著介紹 malloc 與 free、記憶體洩漏、懸置指標、緩衝區溢位、NULL 指標、結構的填充、聯合與端序、位元欄位、巨集與引入防護、條件編譯、嵌入式中的 volatile,以及未定義行為與編譯器的最佳化。程式的輸出都已在 x86-64 Linux 上以 gcc 實際編譯確認。虛擬碼的追蹤在「程式設計基礎(虛擬碼追蹤)」,使用 volatile 的中斷與暫存器操作在「嵌入式與韌體」,編譯器最佳化的細節在「編譯器」,記憶體配置與連結則在「連結器與載入器與執行檔格式」單元中介紹。

C語言基礎的題目列表(40題)

  1. C語言的標準中,關於 int 型別的大小有何規定?下列何者正確?
  2. 在嵌入式程式中,存放32位元周邊暫存器值的變數,常以 stdint.h 的 uint32_t 宣告,而不是 unsigned int。主要理由為下列何者?
  3. 執行上方含有整數除法的程式碼時的輸出,下列何者正確?
  4. 執行上方使用前置與後置 ++ 的程式碼時的輸出,下列何者正確?
  5. 執行上方在 if 敘述的條件中寫了 = 的程式碼時的輸出,下列何者正確?
  6. 為了檢查暫存器值 reg 的位元2是否為1,寫了上方的程式碼。執行時的結果,下列何者正確?
  7. uint8_t 是8位元的無號整數型別。執行上方程式碼時的輸出,下列何者正確?
  8. uint8_t 是8位元的無號整數型別。執行上方讓 x 遞增10次的程式碼時的輸出,下列何者正確?
  9. unsigned char 為8位元,int 為32位元。執行上方程式碼時的輸出,下列何者正確?
  10. uint8_t 是8位元的無號整數型別,int 為32位元。執行上方程式碼時的結果,下列何者正確?
  11. int 與 unsigned int 為32位元。執行上方程式碼時的結果,下列何者正確?
  12. unsigned int 為32位元。執行上方程式碼時的動作,下列何者正確?
  13. 設定「char c = 200;」並以 printf 的 %d 顯示 c 的程式,以 x86-64 Linux 用的 gcc 編譯執行時顯示 −56,以 Arm Linux 用的 gcc 則顯示200。產生差異的理由為下列何者?
  14. 執行上方在 && 與 || 的右邊寫了 b++ 的程式碼時的輸出,下列何者正確?
  15. 執行上方含有沒有 break 之 case 的 switch 敘述時的輸出,下列何者正確?
  16. 執行上方程式時的輸出,下列何者正確?
  17. 連續呼叫上方的函式 f 三次時,第3次的回傳值為下列何者?
  18. C語言中,(1) 在函式中沒有加 static 宣告的區域變數、(2) 以 malloc 配置的區域、(3) 在函式外宣告的變數,各自存在的期間(生命週期)的組合,下列何者正確?
  19. int 為32位元(最大值 2147483647)。上方的函式 fact(n) 能不發生溢位、正確回傳 n 的階乘的最大 n 為下列何者?
  20. int 為4位元組,指標為8位元組。指向 int 的指標 p 的值(位址)為 0x1000 時,p + 3 的值為下列何者?
  21. int 為4位元組,指標為8位元組。執行上方程式時的輸出,下列何者正確?
  22. int 為4位元組。執行上方程式碼時的輸出,下列何者正確?
  23. 關於放入字串的 char 陣列,執行上方程式碼時的輸出,下列何者正確?
  24. 在上方的宣告之後,寫入甲「p = t;」、乙「*p = 'x';」、丙「q = t;」、丁「*q = 'x';」其中之一。會發生編譯錯誤的組合為下列何者?
  25. 執行上方使用函式指標陣列的程式時的輸出,下列何者正確?
  26. fill 與 use 是另外定義的函式。上方函式的問題點,下列何者正確?
  27. 關於上方函式 make 所回傳的指標,下列何者正確?
  28. C語言中,建議在 free(p); 之後立刻寫 p = NULL; 的理由,下列何者最適當?
  29. 把8個字元的字串 "ABCDEFGH" 傳給上方的函式 save。會發生的事,下列何者正確?
  30. C語言中,參考 NULL 指標(p 為 NULL 時讀取 *p)時的說明,下列何者正確?
  31. 假設是 char 為1位元組、int 為4位元組,且 int 放在4的倍數位址上的一般環境。執行上方程式碼時的輸出,下列何者正確?
  32. uint32_t 與 uint8_t 分別是32位元與8位元的無號整數型別,且為小端序環境。執行上方程式碼時的輸出,下列何者正確?
  33. 執行上方把9放入3位元位元欄位的程式碼時的輸出,下列何者正確?
  34. 執行上方使用以 #define 定義之巨集 SQUARE 的程式碼時的輸出,下列何者正確?
  35. 標頭檔 sensor.h 寫成上方的樣子。#ifndef、#define、#endif 這3行的目的,下列何者正確?
  36. 把上方程式碼寫在 main 函式中執行時的輸出,下列何者正確?
  37. 微控制器的輸出暫存器以上方的方式宣告並使用。關於這個宣告的說明,下列何者正確?
  38. 關於C語言標準所說的未定義行為,下列說明何者正確?
  39. int 與 unsigned int 為32位元。下列何者依C語言的標準屬於未定義行為?
  40. 以 gcc 啟用最佳化來編譯上方的函式時,if (p == NULL) 的判斷可能被刪除。其理由為下列何者?

電腦系統的其他領域