TIOBE 索引再次將 C 語言推至榜首。這不代表 C「戰勝」了 Python、Java 或 C++,而是反映了**工業級基礎設施、嵌入式系統、操作系統內核、高性能計算、編譯器工具鏈**等硬核領域對 C 的不可替代性。本文不談榜單統計細節,而是通過經典小程序重溫 C 的極簡哲學,探討程序員應如何面對語言更迭。
#include
int main(void) {
int blanks = 0, tabs = 0, newlines = 0;
int c;
while ((c = getchar()) != EOF) {
if (c == ' ') blanks++;
if (c == '\t') tabs++;
if (c == '\n') newlines++;
}
printf("Blanks: %d\nTabs: %d\nNewlines: %d\n", blanks, tabs, newlines);
return 0;
}
#include
int main(void) {
int blanks = 0, tabs = 0, newlines = 0;
int c, last_char = 0;
int done = 0;
while (!done) {
c = getchar();
if (c == ' ') blanks++;
if (c == '\t') tabs++;
if (c == '\n') newlines++;
if (c == EOF) {
if (last_char == '\n') newlines++; // 文件以換行結尾時 EOF 不重複計數
done = 1;
}
last_char = c;
}
printf("Blanks: %d\nTabs: %d\nNewlines: %d\n", blanks, tabs, newlines);
return 0;
}
好的命名勝過註釋。
blanks、tabs、newlines見名知意;done、last_char清楚表達狀態機意圖。小程序可隨意,但**中大型項目中,命名規範、模塊劃分、架構文檔**決定維護成本。不要讓繼任者 (包括未來的自己) 猜變量含義。
#include
#define NONBLANK 'x' // 任意非空格字符
int main(void) {
int c, last = NONBLANK;
while ((c = getchar()) != EOF) {
if (c != ' ') putchar(c);
if (c == ' ' && last != ' ') putchar(c); // 保留第一個空格
last = c;
}
return 0;
}
int c, inspace = 0;
while ((c = getchar()) != EOF) {
if (c == ' ') {
if (!inspace) { inspace = 1; putchar(c); }
} else {
inspace = 0;
putchar(c);
}
}
int c;
while ((c = getchar()) != EOF) {
switch (c) {
case '\\': putchar('\\'); putchar('\\'); break;
case '\t': putchar('\\'); putchar('t'); break;
case '\b': putchar('\\'); putchar('b'); break;
default: putchar(c); break;
}
}
getchar/putchar 是**標準流 I/O 的原子操作**,組合出任意文本處理邏輯。switch 多分支清晰;if-else 靈活;**選擇可讀性最高者**,現代編譯器優化後性能無差。
int c, inspace = 0;
while ((c = getchar()) != EOF) {
if (c == ' ' || c == '\t' || c == '\n') {
if (!inspace) { inspace = 1; putchar('\n'); } // 詞間輸出換行
} else {
inspace = 0;
putchar(c);
}
}
inspace 這個「開關狀態」是有限狀態機 (FSM) 在文本處理中的典型體現:**狀態少、轉移清晰、零內存開銷**。這正是 C 語言擅長的領域——**用最小代價表達確定性邏輯**。
| 誤區 | 現實 |
|---|---|
| 「某語言完美,一統江湖」 | **不存在完美語言**。每種語言都是針對特定領域 (Web/系統/數據/腳本/嵌入式) 的權衡產物。 |
| 「緊跟潮流學新語言」 | **核心能力可遷移**:數據結構、算法、系統原理、工程規範、調試思維。**語言只是表達工具**。 |
| 「鄙視舊語言/舊技術」 | C、C++、Fortran、COBOL 仍在支撐全球核心系統。**尊重歷史,理解演進邏輯**,而非盲目追新。 |
| 「造輪子/炫技巧」 | **工程首選成熟庫/標準庫**。getchar/putchar、qsort、memmove 經過幾十年打磨,比手寫更可靠。 |
C 語言重回榜首,是對「簡單、直接、贴近機器、零開銷抽象」這一設計哲學的長期驗證。但榜單從不寫代碼,**寫代碼的是人**。與其爭論語言優劣,不如在下一行代碼中,用最清晰的命名、最合適的數據結構、最穩健的錯誤處理,表達你的解決方案。**語言會過時,清晰的思維與扎實的工程素養永不過時。**