// 情況 1
while (n = 1/3) { /* 迴圈體 */ }
// 情況 2
for (; 2; ) { /* 迴圈體 */ }
若改為 `while (n = 1.0/3)` → `n=0.333...` 非 0 → 無限迴圈 (無 break/修改 n)。
while (n = 1/3); // 分號結尾 = 空語句作為迴圈體
// 編譯器可能優化掉,或陷入無限空轉 (若條件為真)
// 此處條件為假,僅執行一次賦值 n=0 即結束
for (; 2; ); // 無限空迴圈,CPU 100% 佔用,程式卡死
// 必須在迴圈體內有 break 或修改條件變數
現代編譯器 (GCC/Clang/MSVC `-O2`) 會檢測無副作用的無限空迴圈並直接刪除或報警告:
warning: iteration 36u invokes undefined behavior [-Waggressive-loop-optimizations]
note: the loop contains no side-effects, assuming it terminates
實際專案中絕不應出現無副作用的無限迴圈,需在迴圈體執行 I/O、睡眠、原子操作等可觀測副作用。
| 意圖 | 推薦寫法 |
|---|---|
| 有限次數迴圈 | for (int i=0; i |
| 條件迴圈 | while (condition) |
| 無限迴圈 (需 break) | while (true) { if (exit_cond) break; ... } |
| 輪詢/事件迴圈 | for (;;) { event = wait_event(); handle(event); } |