#include <stdio.h>
void mian() { // 拼寫錯誤:mian ≠ main
int b = 0;
for (int i = 1; i < 10; i++) {
while (b < 7) {
b++;
printf("%d\n", b);
}
printf("你終於跳出來了!\n");
}
}
編譯通過,連結錯誤:
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
fatal error LNK1120: 1 unresolved externals
| 錯誤類型 | 位置 | 說明 |
|---|---|---|
| 連結錯誤 | void mian() | 入口點函數必須命名為 main,連結器尋找 _main 符號,mian 導致找不到入口點 |
| 邏輯特性 | 迴圈嵌套 | 外層 for 執行 9 次,內層 while 僅第一次執行 7 次(b 0→7),後 8 次外層迴圈內層 while 條件 b<7 為假直接跳過 |
#include <stdio.h>
int main() { // 修正拼寫
int b = 0;
for (int i = 1; i < 10; i++) {
while (b < 7) {
b++;
printf("%d\n", b);
}
printf("你終於跳出來了!\n");
}
return 0;
}
| 外層 i | 內層 while 執行次數 | b 變化 | 輸出 |
|---|---|---|---|
| 1 | 7 次 | 0 → 7 | 1,2,3,4,5,6,7 + "跳出來" |
| 2-9 | 0 次 (b=7 不滿足 b<7) | 保持 7 | 僅 "跳出來" × 8 |
總輸出:數字 1-7 各一次,"你終於跳出來了!" 共 9 行。
main(小寫),非 mian、Main、MAIN。Win32 Console Application,非 GUI/MFC/DLL。Use Multi-Byte Character Set 或 Not Set,Unicode 專案需 wmain/_tmain。Debug Multithreaded DLL (/MDd),Release 選 Multithreaded DLL (/MD)。stdafx.h,確認 #include "stdafx.h" 為第一行。| 錯誤模式 | 現象 | 修正 |
|---|---|---|
| 內層計數器未重置 | 內層迴圈僅首次執行 | 內層迴圈前 b = 0 或用局部變數 |
| break/continue 層級錯誤 | 跳出錯誤層迴圈 | 用標籤 goto 或重構旗標變數 |
| 條件變數作用域錯誤 | 外層修改內層判斷變數 | 明確變數生命週期,必要時分離 |
| 無限迴圈 | 條件永不為假 | 檢查遞增/遞減邏輯、邊界條件 |
gcc -Wall -Wextra -pedantic -std=c17 -g -O2 開啟所有警告、標準模式、除錯資訊、優化。本題核心教訓:連結錯誤往往源於主函數拼寫錯誤或專案配置錯誤,而非代碼邏輯。迴圈嵌套中,內層迴圈控制變數若在外層聲明且不重置,將導致內層僅首次執行。現代工具鏈能在編譯期捕捉更多此類問題,建議盡早遷移。