next up previous contents
Next: break Up: 迴圈 Previous: 無窮迴圈   Contents


空迴圈

  1. 空迴圈是指迴圈中沒有任何的執行敍述,那為什麼要有空迴圈?
  2. for, while, do...while 用大括號 {..} 括住要重複執行的敍述,若重複執行的敍述只有一條,大括號可以省略,例如:
    for (i=1; i<=a; i++)
    	print("i=%d\n", i);
    
  3. 注意 for 迴圈小括號後面不能有分號 ";",有分號代表迴圈結束,此時就產生空迴圈,會等退出 for 迴圈才會印出數字。
    for (i=1; i<=a; i++);
    	print("i=%d\n", i);
    
  4. 空迴圈雖然沒有任何執行敍述,但程式會做迴圈控制變數的遞增與條件判斷,程式還是會耗費 CPU 處理時間。
  5. 如果不是程式設計者不小心照成的空迴圈,可以刻意使用空迴圈讓執行延遲。
  6. 範例:輸入一數字來延遲輸出。
    [dywang@dyw219 zzz]$ vim nullloop1.c
    [dywang@dyw219 zzz]$ cat nullloop1.c 
    #include <stdio.h>
    
    main() {
    	int i=1, a;
    
    	do {
    		printf("Enter an integer: ");
    		scanf("%d", &a);
    	} while ( a<=0 );
    
    	for (i=1; i<=a; i++);
    	printf("i=%d\n", i );
    }
    
  7. 編譯成功
    [dywang@dyw219 zzz]$ gcc -o nullloop1 nullloop1.c
    
  8. 執行結果:輸入的數字越大,程式執行時間越久。
    [dywang@dyw219 zzz]$ ./nullloop1 
    Enter an integer: 10
    i=11
    [dywang@dyw219 zzz]$ time ./nullloop1
    Enter an integer: 100
    i=101
    
    real	0m1.767s
    user	0m0.000s
    sys	0m0.002s
    [dywang@dyw219 zzz]$ time ./nullloop1
    Enter an integer: 1000000
    i=1000001
    
    real	0m3.059s
    user	0m0.004s
    sys	0m0.002s
    [dywang@dyw219 zzz]$ time ./nullloop1
    Enter an integer: 100000000
    i=100000001
    
    real	0m16.439s
    user	0m0.271s
    sys	0m0.002s
    
  9. 修改 7.4 「標準輸入輸出」的 stdio3.c,使用空迴圈直到讀到 Enter 換行符號,再繼續輸入字串。



De-Yu Wang 2019-08-14