在 ANSI C (C89/C90) 標準中,所有變量聲明必須位於區塊(`{}`)的開頭,先於任何執行語句。這是編譯器單次掃描、簡化符號表管理、確定棧幀大小的歷史設計決策。
/* C89 風格:合法 */
void foo_c89() {
int a, b; // 所有聲明在前
float c;
a = 10; // 執行語句在後
b = a + 5;
c = 3.14f;
}
/* C89 風格:非法,編譯報錯 */
void foo_invalid_c89() {
int a = 10;
a = a + 5;
int b = 20; // 錯誤:聲明出現在執行語句之後
}
早期編譯器(1970-80年代)記憶體極小,採用單次掃描生成目標碼。編譯器需在遇到第一條執行指令前,已知該函數所有區域變量的類型、大小、偏移量,以便分配固定棧幀。若允許聲明穿插,編譯器需多次掃描或維護複雜符號表,超出當時硬體能力。
C99 標準(1999年)引入混合聲明與代碼,允許在任意位置聲明變量(甚至 `for (int i=0; ...)`)。現代主流編譯器(GCC、Clang、MSVC 19+)預設支援 C99/C11/C17/C23,此限制已成歷史。
/* C99 及以後:合法且推薦 */
void foo_modern() {
int a = 10;
a = a + 5;
int b = 20; // 就近聲明,提高可讀性
for (int i = 0; i < b; ++i) { // 循環變量作用域最小化
// ...
}
}
「變量聲明必須放最上面」是C89 標準為適應早期編譯器技術限制而制定的規則。現代 C 開發(C99+)早已解除此限制,推薦採用就近聲明、最小作用域、聲明即初始化的現代風格,編寫更安全、可讀、可維護的代碼。