for(;;) 無限迴圈詳解:為什麼它會永遠跑下去?for(;;) 是 C/C++ 中最簡潔的無限迴圈寫法,三個分號分隔的初始化、條件、遞增表達式全為空,語意等同 while(1)。
for(;;) 永不結束?for 迴圈語義:
for (init; condition; increment) body;
// 等價於
init;
while (condition) {
body;
increment;
}
當 condition 為空時,C 標準規定其值為真(非零),因此迴圈永不因條件判斷而終止,只能靠 break、return、exit()、longjmp() 或例外(C++)跳出。
// 錯誤示範
for (i = 0; i = 10; i++) // 這裡 i = 10 是賦值,值為 10(真),導致無限迴圈
;
正確寫法: 條件必須是關係/邏輯表達式:
for (i = 0; i < 10; i++) // 執行 10 次 (i = 0..9)
for (i = 0; i <= 10; i++) // 執行 11 次 (i = 0..10)
accept() 迴圈。while(!(STATUS_REG & READY_BIT)) ;(需加 volatile)。for(;;){ show_menu(); if(handle_input()) break; }for(;;) 或 while(1),並在迴圈頂端加註釋 /* infinite loop */。break 或 return,避免真正的死鎖。WDT_Reload()),否則系統會複位。goto 模擬迴圈: 結構化迴圈更易閱讀、分析、優化。for(;;) vs while(1) 編譯器視角現代編譯器(GCC, Clang, MSVC)對兩者生成完全相同的機器碼(無條件跳轉指令)。選擇純粹是風格偏好,團隊統一即可。
總結: for(;;) 是無限迴圈的標準慣用語,本身無錯誤;錯誤通常在於誤將賦值寫在條件位置,或缺少跳出機制。理解 for 三表達式語義,自然避開此坑。