C语言程序流程控制:从循环到选择语句的深入解析
立即解锁
发布时间: 2025-08-25 02:18:38 阅读量: 1 订阅数: 4 

### C语言程序流程控制:从循环到选择语句的深入解析
#### 1. do语句
do语句是一种特殊的while语句,它在循环的底部而不是顶部计算表达式。其语法结构如下:
```c
do
statement
while ( expression );
```
示例代码:
```c
i = 1;
do {
printf( "%d\n", i );
i++;
}
while ( i < 3 );
printf( "We are past the do loop." );
```
在这个示例中,第一次循环时,`i` 的值为1,`printf()` 函数在控制台窗口打印1,然后 `i` 的值增加到2。此时才计算表达式 `( i < 3 )`,因为2小于3,所以会进行第二次循环。第二次循环时,`printf()` 打印2,`i` 变为3,再次计算表达式 `( i < 3 )`,由于3不小于3,程序跳出循环,执行下一个 `printf()` 语句。
需要注意的是,由于表达式在循环底部计算,do循环的循环体(即 `statement`)至少会执行一次。而for和while循环在循环顶部检查表达式,它们有可能在执行循环体之前就跳出循环。
#### 2. switch语句
switch语句根据表达式的值来确定执行一系列语句中的哪一个。示例如下:
```c
switch ( theYear ) {
case 1066:
printf( "Battle of Hastings" );
break;
case 1492:
printf( "Columbus sailed the ocean blue" );
break;
case 1776:
printf( "Declaration of Independence\n" );
printf( "A very important document!!!" );
break;
default:
printf( "Don't know what happened during this year" );
}
```
switch语句和if语句都属于选择语句。switch由一系列的case组成,每个case基于 `theYear` 的特定值。如果 `theYear` 的值为1066,程序将继续执行该case冒号后面的语句,即 `printf( "Battle of Hastings" );`。程序会逐行执行,直到遇到switch的右花括号或 `break` 语句。在这个例子中,下一行就是 `break` 语句。
`break` 语句在处理switch语句和循环时非常有用,它会告诉编译器立即跳转到循环或switch结束后的下一个语句。
如果 `theYear` 的值为1492,switch会跳转到 `printf( "Columbus sailed the ocean blue" );` 这一行;如果值为1776,则跳转到 `printf( "Declaration of Independence\n" );` 和 `printf( "A very important document!!!" );` 这两行。
每个case可以包含任意数量的语句,甚至可以没有语句。例如:
```c
switch ( numberOfEggs ) {
case 1:
case 2:
HardBoilThem();
break;
case 3:
MakeAnOmelet();
}
```
在这个例子中,如果 `numberOfEggs` 的值为1或2,会调用 `HardBoilThem()` 函数;如果值为3,会调用 `MakeAnOmelet()` 函数;如果是其他值,则什么都不做。当你希望两个不同的case执行相同的语句时,可以使用没有语句的case。
为了避免上述例子中没有早餐的情况,可以添加默认case:
```c
switch ( numberOfEggs ) {
case 1:
case 2:
HardBoilThem();
break;
case 3:
MakeAnOmelet();
break;
default:
FrenchToastForEveryone();
}
```
这样,当有4个或更多鸡蛋时,每个人都能吃到法式吐司。
#### 3. switch语句的注意事项
- **常量要求**:每个case基于一个常量,如数字(47或 -12932),单字节字符('a' 或 '\n')是有效的常量,而变量(如 `myVar`)和多字节字符串(如 "Gummy - bear")不是。
- **默认case格式**:如果使用默认case,要确保格式正确,不要在 `default` 前加 `case` 这个词。
#### 4. 穿透(fall - through)现象
考虑以下代码:
```c
switch ( myVar ) {
case 1:
DoSometimes();
case 2:
DoFrequently();
default:
DoAlways();
}
```
这段代码中没有 `break` 语句。如果 `myVar` 为1,三个函数都会被调用,这就是穿透现象。即先执行 `DoSometimes()`,然后继续执行 `DoFrequently()`,最后执行 `DoAlways()`。如果 `myVar` 为2,`DoFrequently()` 和 `DoAlways()` 会被调用;如果是其他值,只有 `DoAlways()` 会被调用。
穿透现象可以让你分层设置switch的case,随着穿透过程添加更多功能。但它也有缺点,例如修改代码时可能会引入错误。假设需要在 `myVar` 为2时调用 `OnlyWhenMyVarIs2()` 函数,修改后的代码如下:
```c
switch ( myVar ) {
case 1:
DoSometimes();
case 2:
DoFrequently();
OnlyWhenMyVarIs2();
default:
DoAlways();
}
```
在这个版本中,当 `myVar` 为1或2时,`OnlyWhenMyVarIs2()` 都会被执行。因为case 1结尾没有 `break`,所以添加到case 2的任何内容也会影响case 1。解决这个问题的方法有两个:一是在代码中添加大量注释,明确说明使用了穿透;二是避免使用穿透。
#### 5. break语句在其他循环中的应用
break语句除了在switch语句中使用,还可以用于其他循环。例如在while循环中的应用:
```c
i=1;
while ( i <= 9 ) {
PlayAnInning( i );
if ( IsItRaining() )
break;
i++;
}
```
这个示
0
0
复制全文
相关推荐










