初學 C 語言時,\a (BEL, ASCII 7) 能讓終端機發出蜂鳴聲,常被用於簡單提示。但直接在緊湊迴圈中連續輸出 printf("\a\a") 配合倒計時邏輯,卻會導致「數字瞬間刷完、聲音延遲播放、甚至程式崩潰」的現象。根源在於 標準輸出緩衝 與 硬體蜂鳴器響應時間 的不匹配。
stdout 預設行緩衝,遇換行符才刷新。迴圈無換行,導致所有數字堆積在緩衝區,迴圈結束才一次性輸出。\a 會堆疊硬體中斷,造成聲音重疊或系統忙碌。#include <stdio.h>
#include <windows.h> // Windows 平台 Sleep(ms)
int main() {
int b = 20;
for (int n = 0; n <= 20; n++) {
printf("\a\a%d ", b - n);
fflush(stdout); // 強制刷新緩衝區,即時顯示數字
Sleep(500); // 500ms 延遲,給蜂鳴器與人耳反應時間
}
getchar();
return 0;
}
Sleep(ms) (windows.h)usleep(us) 或 nanosleep() (unistd.h)thrd_sleep() (threads.h)若需精準控制音頻頻率、持續時間,建議使用平台 API:
Beep(freq, duration)ioctl(fd, KIOCSOUND, ...) 或 libasound總結:\a 適合簡單提示,做倒計時等需同步視聽回饋的場景,務必加入 延遲 與 緩衝區刷新,避免競態條件導致的異常行為。