跳转到内容

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 个参数。

华夏公益教科书