跳轉到內容

C 語言入門 / C 控制結構

來自華夏公益教科書,自由的教學資源

C 語言包含許多迴圈結構,例如 "while" 迴圈

   /* while.c */

   #include <stdio.h>

   void main()
   {
     int test = 10;
     while( test > 0 )
     {
       printf( "test = %d\n", test );
       test = test - 2;
     }
   }

如果 "test" 的初始值小於或等於 0,則 "while" 迴圈將不會執行,即使只有一次。 還有一個變體 "do",它總是至少執行一次

   /* do.c */

   #include <stdio.h>

   void main()
   {
     int test = 10;
     do 
     {
       printf( "test = %d\n", test );
       test = test - 2;
     }
     while( test > 0 );
   }

最常見的迴圈結構是 "for" 迴圈,它建立了一個類似於 "while" 迴圈但更緊湊的迴圈

   /* for.c */

   #include <stdio.h>
   
   void main()
   {
     int test;
     for( test = 10; test > 0; test = test - 2 )
     {
       printf( "test = %d\n", test );
     }
   }

請注意,對於所有這些迴圈,初始迴圈語句 *不* 以 ";" 結尾。 如果在上面的 "for" 語句末尾放置一個 ";",則 "for" 語句將執行完畢,但不會執行迴圈體中的任何語句。

"for" 迴圈的語法為

   for( <initialization>; <operating test>; <modifying expression> )

括號中的所有元素都是可選的。 "for" 迴圈可以使用以下程式碼無限次執行

   for( ; ; )
   {
     ...
   }

—雖然使用無限 "while" 迴圈更簡潔

   while( 1 )
   {
     ...
   }

可以使用 "," 運算子在初始化表示式或修改表示式中使用多個表示式

   /* formax.c */

   #include <stdio.h>

   void main()
   {
     int a, b;
     for ( a = 256, b = 1; b < 512 ; a = a / 2, b = b * 2 )
     {
       printf( "a = %d  b = %d\n", a, b );
     }
   }

C 語言可用的條件測試如下

   a == b    equals                       
   a != b    not equals
   a < b     less than                    
   a > b     greater than
   a <= b    less than or equals          
   a >= b    greater than or equals

使用 "==" 執行 "等於" 測試,而使用 "=" 作為賦值運算子這一事實經常會導致混淆,這也是 C 語言程式設計中常見的錯誤

   a == b    Is "a" equal to "b"?
   a = b     Assign value of "b" to "a".

C 語言還包含決策語句,例如 "if"

   /* if.c */

   #include <stdio.h>
   #define MISSILE 1

   void fire( int weapon );

   void main()
   {
     fire( MISSILE );
   }

   void fire( int weapon )
   {
     if( weapon == MISSILE )
     {
       printf( "Fired missile!\n" );
     }
     if( weapon != MISSILE )
     {
       printf( "Unknown weapon!\n");
     }
   }

這個例子可以使用 "else" 子句更輕鬆地實現

   /* ifelse.c */

   void fire( int weapon )
   {
     if( weapon == MISSILE )
     {
       printf( "Fired missile!\n" );
     }
     else
     {
       printf( "Unknown weapon!\n");
     }
   }

由於每個子句中只有一個語句,因此花括號實際上並不必要。 這個例子也能正常工作

   void fire( int weapon )
   {
     if( weapon == MISSILE )
       printf( "Fired missile!\n" );
     else
       printf( "Unknown weapon!\n" );
   }

但是,花括號使結構更清晰,並可以防止在條件子句中新增語句時出現錯誤。 編譯器並不關心哪種方式,它會生成相同的程式碼。

沒有 "elseif" 關鍵字,但可以巢狀 "if" 語句

   /* nestif.c */

   #include <stdio.h>
   #define MISSILE 1
   #define LASER 2

   void fire( int weapon );

   void main()
   {
     fire( LASER );
   }

   void fire( int weapon )
   {
     if( weapon == MISSILE )
     {
       printf( "Fired missile!\n" );
     }
     else
     {
       if( weapon == LASER )
       {
         printf( "Fired laser!\n" );
       }
       else
       {
         printf( "Unknown weapon!\n");
       }
     }
   }

這有點笨拙。 "switch" 語句執行得更乾淨

   /* switch.c */

   void fire( int weapon )
   {
     switch( weapon )
     {
     case MISSILE:
       printf( "Fired missile!\n" );
       break;
     case LASER:
       printf( "Fired laser!\n" );
       break;
     default:
       printf( "Unknown weapon!\n");
       break;
     }
   }

"switch" 語句測試單個變數的值;與 "if" 語句不同,它不能測試多個變數。 可選的 "default" 子句用於處理其他 case 未覆蓋的條件。

每個子句都以一個 "break" 結尾,它會導致執行退出 "switch"。 遺漏 "break" 可能是 C 程式中另一個細微的錯誤,因為如果沒有它,執行將直接流入下一個子句。 然而,這可以被利用。 假設在我們的示例中,該例程也可以被要求發射一枚 ROCKET,它與 MISSILE 相同

   void fire( int weapon )
   {
     switch( weapon )
     {
     case ROCKET:
     case MISSILE:
       printf( "Fired missile!\n" );
       break;
     case LASER:
       printf( "Fired laser!\n" );
       break;
     default:
       printf( "Unknown weapon!\n");
       break;
     }
   }

"break" 語句不特定於 "switch" 語句。 它可以用於退出其他控制結構,儘管良好的程式設計往往避免這種即興發揮

   /* break.c */

   #include <stdio.h>

   void main()
   {
     int n;
     for( n = 0; n < 10; n = n + 1 )
     {
       if( n == 5 )
       {
         break;  /* Punch out of loop at value 5. */
       }
       else
       {
         printf( "%d\n", n );
       }
     }
   }

如果 "for" 迴圈巢狀在 "while" 迴圈中,"break" 退出

"for" 迴圈仍會讓你陷入 "while" 迴圈中。 "break" 關鍵字只適用於執行它的控制結構。

還有一個 "continue" 語句,它跳到迴圈體末尾,並繼續執行迴圈的下一個迭代。 例如

   /* continue.c */

   #include <stdio.h>

   void main()
   {
     int n;
     for( n = 0; n < 10; n = n + 1 )
     {
       if( n == 5 )
       {
         continue;
       }
       else
       {
         printf( "%d\n", n );
       }
     }
   }

最後,還有一個 "goto" 語句

   goto punchout;
   ...
   punchout:

—跳到函式內的任意標記,但這

語句通常不建議使用,在實踐中很少見。

雖然這些是 C 語言的全部真實控制結構,但還有一個特殊的 "條件運算子",它執行形式為以下簡單的條件賦值

   if( a == 5) 
   {
     b = -10;
   }
   else
   {
     b = 255;
   }

—使用更簡潔但更神秘的格式

   b = ( a == 5 ) ? -10 : 255 ;

the ?: 結構稱為三元運算子 - 或三元運算子 - 因為它接受 3 個引數。

華夏公益教科書