C语言入门小册子
C语言中的循环与条件控制语句
循环结构
C语言提供了多种循环结构,常见的有 while
、do-while
和 for
循环。
while
循环
while
循环在每次迭代开始之前检查条件。如果条件为 false
,循环体不会执行。
/* 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-while
循环
do-while
循环至少执行一次循环体,因为条件检查在循环体之后。
/* do.c */
#include <stdio.h>
void main()
{
int test = 10;
do
{
printf( "test = %d\n", test );
test = test - 2;
}
while( test > 0 );
}
for
循环
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( ; ; )
{
...
}
或者使用更清晰的无限循环:
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 |
等于 |
a != b |
不等于 |
a < b |
小于 |
a > b |
大于 |
a <= b |
小于或等于 |
a >= b |
大于或等于 |
需要注意,==
用于相等测试,而 =
是赋值操作符。这是C编程中常见的错误来源:
a == b // 判断 a 是否等于 b
a = b // 将 b 的值赋给 a
条件控制语句
if
语句
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");
}
}
输出结果:
Fired missile!
if-else
语句
使用 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" );
}
尽管可以省略花括号,推荐保留它们以提高代码可读性,特别是在需要添加新语句时可以避免错误。
总结
- 循环结构:
while
、do-while
和for
提供了灵活的迭代机制。for
更紧凑,但适用场景与while
类似。 - 条件测试:了解不同的比较运算符,并避免混淆
==
和=
。 - 条件控制:通过
if
和if-else
实现程序的分支逻辑。花括号虽然是可选的,但推荐使用以确保代码清晰且易于维护。
C语言中的控制结构与操作符
嵌套的 if
语句
C语言没有 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
语句可以更简洁地实现多分支判断。例如:
/* 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
只能测试单个变量的值,无法测试多个条件。default
是可选的,用于处理未被其他分支覆盖的情况。- 每个
case
通常以break
结束,跳出switch
语句。漏写break
可能导致执行流继续到下一个分支。
利用跳过特性:
若某些分支需要共享逻辑,可以省略 break
:
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
语句
break
可用于退出循环或 switch
语句。例如:
/* break.c */
#include <stdio.h>
void main()
{
int n;
for( n = 0; n < 10; n = n + 1 )
{
if( n == 5 )
{
break; /* 当 n 为 5 时退出循环。 */
}
else
{
printf( "%d\n", n );
}
}
}
如果循环嵌套在其他循环中,break
仅会退出当前循环,而不会影响外层循环。
continue
语句
continue
会跳过循环体的剩余部分,直接开始下一次迭代。例如:
/* continue.c */
#include <stdio.h>
void main()
{
int n;
for( n = 0; n < 10; n = n + 1 )
{
if( n == 5 )
{
continue; /* 跳过 n = 5 的输出。 */
}
else
{
printf( "%d\n", n );
}
}
}
输出:
0
1
2
3
4
6
7
8
9
goto
语句
goto
可以跳转到函数中的任意标签:
goto punchout;
...
punchout:
虽然 goto
能实现灵活的控制流,但因容易导致代码难以维护,因此通常被认为是不良实践。
条件运算符 ?:
C语言提供了一个特殊的条件运算符,用于简化条件赋值。例如:
if( a == 5 )
{
b = -10;
}
else
{
b = 255;
}
可以用更简洁的三元运算符表示:
b = ( a == 5 ) ? -10 : 255 ;
特点:
- 三元运算符
?:
被称为三元操作符,因为它需要三个操作数。 - 语法格式为:
条件表达式 ? 表达式1 : 表达式2
。当条件为true
时,执行表达式1
,否则执行表达式2
。
总结
- 嵌套
if
虽然灵活,但容易显得冗长。switch
提供了一种更简洁的多分支解决方案。 - 使用
break
和continue
控制循环的执行,但应谨慎使用以避免破坏代码的可读性。 - 条件运算符
?:
提供了简洁的条件赋值语法,但可读性略逊于传统if-else
结构。 - 避免使用
goto
,除非有非常明确的理由。