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