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

C 語言自學十問十答:從語言分級到編譯鏈路

     編輯:關於C

前言

整理 C 語言入門十大核心問題,涵蓋語言分層、歷史、編譯流程、常數類型、巨集與變數差異,適合初學者建立正確心智模型。

Q1:為何分低階與高階語言?

機器指令:二進位機器碼(如 00000010)。
機器語言:指令集合,CPU 型號不同指令集不同。
符號語言(組合語言):用助憶符號(ADD A,B)取代機器碼,需組譯器轉機器碼。貼近硬體、不可攜帶,稱低階語言。
高階語言:不依賴特定機器,符合人類思維(如 printf),需編譯器轉機器碼,一行對應多條機器指令。

Q2:高階語言主要分類?

  • 面向過程:C、Pascal、Fortran
  • 面向物件:C++、Java、C#、Python
  • 函數式:Haskell、Lisp、F#
  • 腳本/動態:JavaScript、PHP、Ruby

Q3:C 語言簡史

  • 1973 年:貝爾實驗室發明 C,重寫 Unix
  • 1983 年:ANSI X3J11 成立標準化委員會
  • 1989 年:ANSI C (C89/C90) 正式發布
  • 1999 年:C99 標準(支援 // 註解、stdint.h、VLA 等)
  • 2011 年:C11(多執行緒、_Generic、對齊控制)
  • 2018 年:C18(修正錯誤)
  • 2024 年:C23(即將發布,含 nullptr、typeof 等)

Q4:為何要 #include <stdio.h>?

C 本身無 I/O 語句,標準庫提供 printf/scanf 等函數,原型宣告於 stdio.h。#include 將標頭檔內容展開至原始檔,使編譯器知曉函數簽名。

Q5:C 為何常寫系統軟體?

  • 可直接操作記憶體位址(指標)
  • 語言精簡,編譯器易實作,運行庫極小
  • 接近硬體,效能可預測
  • Unix/Linux/Windows 核心均以 C 為主

Q6:最簡 main 為何這樣寫?

int main(void) { return 0; }
  • int 回傳值:C99 建議明確宣告;0 代表成功,非 0 代表失敗(錯誤碼可區分失敗原因)。
  • void 參數:明確表示不接受命令列參數。

Q7:為何需要函數宣告?

編譯器單次掃描,呼叫前未見定義會報錯 identifier not found。解決:
1. 函數原型前置宣告
2. 定義提前至呼叫之前
3. 將原型置於標頭檔 .h,#include 引入

Q8:為何需要連結步驟?

  • .c 編譯產出 .obj/.o(目標檔),含機器碼但符號未解析。
  • 多檔案各產出目標檔,需連結器合併並解析外部符號。
  • 單檔案也需與 C 標準庫(libc)連結。

Q9:常數有哪些類型?

  1. 整數常數:1, 55, 0xFF
  2. 浮點常數:50.2, 78.34e4
  3. 字元常數:'a', '\n', '\033' (八進位), '\x1B' (十六進位)
  4. 字串常數:"hello"(以 \0 結尾)
  5. 符號常數:#define PI 3.14159
  6. const 限定變數:const double PI = 3.14159;

Q10:#define vs const 差異?

特性#define PI 3.14const double PI = 3.14;
本質前處理器文字替換(符號常數)唯讀變數(有型別、有位址)
記憶體不佔用(編譯期替換)佔用資料段記憶體
型別檢查無有
除錯符號表無 PI,難除錯可在除錯器檢視
作用域檔案級(無視區塊)遵循區塊作用域規則

建議:現代 C/C++ 優先用 const 或 constexpr(C++),僅在條件編譯、字串化、拼接等前處理器專屬場景用 #define。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved