C 語言中 while(條件) 和 while(條件);(後帶分號)行為截然不同,初學者極易混淆導致邏輯錯誤或死循環。
| 寫法 | 含義 | 循環體 | 典型用途 |
|---|---|---|---|
while (expr) { ... } | 標準循環 | 花括號內的語句塊 | 重複執行業務邏輯 |
while (expr); | 空語句循環 | 無(空語句) | 單純等待條件變化、指針移動、忽略輸入 |
char *a = "qwek awemkasd";
while (*a++ != ' '); // 分號關鍵!循環體為空
// 執行完畢後,a 指向 "awemkasd" 首字符 'a'
// 相當於:while (*a != ' ') { a++; } a++; 但更簡潔
*a++ != ' ' 執行:取值判斷、指針後移。int b = 5;
while (b++ < 10) { // 無分號,花括號包裹循環體
printf("%d\n", b); // 循環體執行 5 次,輸出 6,7,8,9,10
}
++,首次判斷用 5,隨後 b 變 6。int i = 0;
while (i < 10); // 錯誤!這裡是空循環,i 永不遞增
i++; // 這行屬於循環外的普通語句,永遠不執行
// 程序卡死在 while 處
while (*p++ != '\0') // 本意:遍歷字符串
process(*p); // 錯誤:process 成為循環體,但 p 已指向下一字符,首字符漏處理,最後多處理 '\0'
// 正確寫法需視具體邏輯調整
while (*a++ != ' '); // 故意空循環:跳過首單詞while (cond) { stmt; },避免分號誤傷。while 後是否緊跟分號,確認是否為有意設計。while(); 是空語句循環,僅反覆求值條件表達式(利用副作用),不執行任何業務代碼;while() { } 才是標準循環。分號一字之差,行為天壤之別,務必嚴謹區分。