#include <stdio.h> int main() { int index = 1; while (--index < 1) printf("How are you!\n"); return 0; }
index 初始化為 1(有符號整數)。--index 先自減再取值:第一次循環判斷前 index 變為 0。0 < 1 為真,進入循環體打印。--index 使 index 從 0 變為 -1,條件 -1 < 1 仍為真。index 持續變為 -2、-3… 條件永遠為真,陷入無限循環。unsigned int index = 1; while (--index < 1) // 第一次判斷 index=0,條件真;第二次 index=UINT_MAX,條件假 printf("How are you!\n");
無符號整數下溢會環繞到最大值(UINT_MAX,通常為 4294967295),條件 UINT_MAX < 1 為假,循環僅執行一次。
for (int i=0; i<n; ++i)),避免依賴溢出特性。| 需求 | 推薦寫法 | 備註 |
|---|---|---|
| 執行 N 次 | for (int i=0; i<N; ++i) | 清晰、無 UB、編譯器易優化 |
| 倒序執行 N 次 | for (int i=N; i--; ) | 利用 i-- 從 N-1 遞減至 0 |
| 無限循環 | while (1) 或 for (;;) | 語義明確 |
這類「技巧」多源於對 C 整數提升、溢出規則的誤解或濫用。專業代碼應追求明確、可移植、無 UB,而非炫技。理解底層機制是為了避坑,而非製造難以維護的「聰明代碼」。