C語言 - 無限迴圈



C語言中,無限迴圈(或死迴圈)是一個永不結束的迴圈結構,它會永遠執行一組語句而不會終止迴圈。它具有一個始終為真的條件,使程式能夠連續執行。

無限迴圈的流程圖

如果程式流程無條件地指向任何先前步驟,則會建立無限迴圈,如下面的流程圖所示:

Flowchart of Infinite loop in C

無限迴圈很少被故意建立。在嵌入式無頭系統和伺服器應用程式的情況下,應用程式在無限迴圈中執行以監聽客戶端請求。在其他情況下,無限迴圈大多是由於無意的程式設計錯誤造成的。

如何在C語言中建立無限迴圈?

要建立無限迴圈,需要使用其中一個迴圈結構(while、do while 或 for),並使用非零值作為測試條件。通常使用 1 作為測試條件,可以使用任何非零值。非零值被認為是真。

示例

#include <stdio.h>

int main() {
  while (1) 
  {
    printf("Hello World");
  }

  return 0;
}
Hello WorldHello WorldHello WorldHello WorldHello WorldHello World
Hello WorldHello WorldHello WorldHello WorldHello WorldHello World
Hello WorldHello WorldHello ...

C語言中無限迴圈的型別

在C語言中,無限 while 迴圈、無限 do while 迴圈和無限 for 迴圈是三種無限迴圈。這些迴圈會連續執行程式碼語句。讓我們瞭解一下使用所有迴圈結構實現無限迴圈的情況。

無限 while 迴圈

使用while關鍵字可以構成計數迴圈。迴圈計劃重複執行,直到某個變數的值連續遞增到預定義的值。但是,如果程式設計師忘記在迴圈體中放置遞增語句,則測試條件根本不會到達,因此它會變成無窮大或無限的。

示例 1

請看下面的例子:

#include <stdio.h>

// infinite while loop
int main(){

   int i = 0;
   while (i <= 10){
      // i++;
      printf("i: %d\n", i);
   }
   return 0;
}

輸出

由於這裡的增量語句已註釋掉,“i”的值繼續保持為“0”,因此輸出會連續顯示“i: 0”,直到您強制停止執行。

i: 0
i: 0
i: 0
...
...

示例 2

while關鍵字的括號中有一個布林表示式,它最初計算結果為真,最終預期會變成假。請注意,任何非零數字在C語言中都被視為真。因此,下面的while迴圈是一個無限迴圈

#include <stdio.h>

// infinite while loop
int main(){

   while(1){
      printf("Hello World \n");
   }
   return 0;
}

輸出

它將無限期地列印“Hello World”。

Hello World 
Hello World 
Hello World 
...
...

while迴圈的語法如下:

while (condition){
   . . .
   . . .
}

請注意,while前面沒有分號符號,這表明以下程式碼塊(在大括號內)是迴圈的主體。如果我們放置一個分號,編譯器會將其視為一個沒有主體的迴圈,因此while條件永遠不會滿足。

示例 3

在下面的程式碼中,增量語句放在迴圈塊內,但由於while前面的分號,迴圈變為無限迴圈。

#include <stdio.h>

// infinite while loop
int main(){

   int i = 0;
   while(i < 10);{
      i++;
      printf("Hello World \n");
   }
   return 0;
}

輸出

When the program is run, it won't print the message "Hello World". There is no output because the while loop becomes an infinite loop with no body.

無限 for 迴圈

C語言中的for迴圈用於對程式碼塊進行迭代,以便為變數的每個值(從其初始值到最終值)執行,每次迭代都會遞增。

請看它的語法:

for (initial val; final val; increment){
   . . .
   . . .
}

示例 1

請注意,for語句的所有三個子句都是可選的。因此,如果省略指定要測試的最終值的中間子句,則迴圈將變為無限迴圈。

#include <stdio.h>

// infinite for loop
int main(){

   int i;
   for(i=1; ; i++){
      i++;
      printf("Hello World \n");
   }
   return 0;
}

輸出

該程式會無限期地列印Hello World,直到您強制停止它,因為它對每次迴圈遞增“i”沒有影響。

Hello World 
Hello World 
Hello World 
...
...

您還可以構造一個用於遞減迴圈變數值的for迴圈。在這種情況下,初始值應大於最終測試值,並且for中的第三個子句必須是一個遞減語句(使用“--”運算子)。

如果初始值小於最終值,並且第三個語句是遞減語句,則迴圈將變為無限迴圈。如果初始值較大,但錯誤地使用了增量語句,則迴圈仍然會變為無限迴圈。

因此,這兩個for迴圈都會導致無限迴圈。

示例 2

請看下面的例子:

#include <stdio.h>

int main(){
  
  // infinite for loop
  for(int i = 10; i >= 1; i++){
    i++;
    printf("Hello World \n");
  }
}

輸出

該程式將無限迴圈列印一系列“Hello World”:

Hello World 
Hello World 
Hello World 
...
...

示例 3

請看下面的例子:

#include <stdio.h>

int main(){

  // infinite for loop
  for(int i = 1; i <= 10 ; i--){
    i++;
    printf("Hello World \n");
  }
}

輸出

該程式在迴圈中不斷列印“Hello World”:

Hello World 
Hello World 
Hello World 
...
...

示例 4

如果括號中的所有三個語句都是空的,則迴圈顯然是無限迴圈,因為沒有條件需要測試。

#include <stdio.h>

int main(){
   
   int i;
   
   // infinite for loop
   for ( ; ; ){
      i++;
      printf("Hello World \n");
   }
}

輸出

該程式在無窮迴圈中列印“Hello World”:

Hello World 
Hello World 
Hello World 
...
...

無限 do while 迴圈

也可以使用do-while迴圈結構實現無限迴圈。必須使用 1 作為 while 的測試條件。

示例

以下示例演示了使用 do while 的無限迴圈

#include <stdio.h>

int main() {
  do 
  {
    printf("Hello World\n");
  } while (1);

  return 0;
}
Hello World
Hello World
Hello World
Hello World
...
...

如何在C語言中中斷無限迴圈?

在程式設計中可能會有某些情況,您需要從無條件whilefor語句開始,但隨後需要透過放置條件break語句來提供終止迴圈的方法。

示例

在下面的程式中,for中沒有測試語句,但我們使用了break語句使其成為有限迴圈。

#include <stdio.h>

int main(){
  
  // infinite while loop
  for(int i = 1; ; ){
    i++;
    printf("Hello World \n");
    
    if(i == 5)
      break;
  }
  return 0;
}

輸出

該程式列印“Hello World”,直到計數器變數達到 5。

Hello World
Hello World
Hello World
Hello World

如何在C語言中強制停止無限迴圈?

當程式進入無限迴圈時,它不會自行停止。它必須強制停止。這是透過按下“Ctrl + C”或“Ctrl + Break”或任何其他按鍵組合(取決於作業系統)來完成的。

示例

以下C程式進入無限迴圈:

#include <stdio.h>
 
int main(){

   // local variable definition
   int a = 0;

   // do loop execution
   LOOP:
      a++;
      printf("a: %d\n", a);
         goto LOOP;
      
   return 0;
}

輸出

執行時,上述程式會從 1 開始列印“a”的遞增值,但不會停止。必須透過按下“Ctrl + Break”鍵來強制停止它。

a: 1
a: 2
...
...
a: 10
a: 11
...
...

無限迴圈大多是由於程式設計錯誤而無意中建立的。即使迴圈關鍵字沒有指定終止條件,也必須使用break關鍵字終止迴圈。

c_loops.htm
廣告