5. 流程控制语句
一、条件判断语句(if 语句)
1. if
语句
用于根据条件执行某段代码。
语法:
if (条件表达式) {// 条件为真时执行的代码
}
示例:
int age = 20;
if (age >= 18) {printf("你已成年。\n");
}
2. if-else
语句
根据条件判断,选择执行两个不同的代码块。
语法:
if (条件表达式) {// 条件为真时执行的代码
} else {// 条件为假时执行的代码
}
示例:
int score = 65;
if (score >= 60) {printf("及格。\n");
} else {printf("不及格。\n");
}
3. if-else if-else
多条件判断
用于多个条件判断的情况。
if (条件1) {// 条件1为真时执行
} else if (条件2) {// 条件2为真时执行
} else {// 所有条件都不满足时执行
}
示例:
int score = 85;
if (score >= 90) {printf("A\n");
} else if (score >= 80) {printf("B\n");
} else if (score >= 70) {printf("C\n");
} else {printf("D\n");
}
二、分支语句(switch-case)
用于根据一个变量的值进行多分支选择。
语法:
switch (表达式) {case 值1:// 匹配值1时执行break;case 值2:// 匹配值2时执行break;...default:// 没有匹配时执行
}
⚠️ 注意:每个
case
分支后面最好加上break
,否则会继续执行下一个case
,称为“穿透”(fall-through)。
示例:
int day = 3;
switch (day) {case 1:printf("星期一\n");break;case 2:printf("星期二\n");break;case 3:printf("星期三\n");break;default:printf("无效的日期\n");
}
三、循环语句
循环语句用于重复执行某段代码。
1. for
循环
适用于已知循环次数的情况。
语法:
for (初始化; 条件判断; 更新表达式) {// 循环体
}
示例:
for (int i = 1; i <= 5; i++) {printf("%d ", i);
}
// 输出:1 2 3 4 5
2. while
循环
适用于不知道循环次数,但知道循环条件的情况。
语法:
while (条件表达式) {// 循环体
}
示例:
int i = 1;
while (i <= 5) {printf("%d ", i);i++;
}
// 输出:1 2 3 4 5
3. do-while
循环
与 while
类似,但先执行一次循环体,再判断条件。
语法:
do {// 循环体
} while (条件表达式);
示例:
int i = 1;
do {printf("%d ", i);i++;
} while (i <= 5);
// 输出:1 2 3 4 5
四、跳转语句(break、continue、goto)
1. break
语句
用于跳出当前循环或 switch
语句。
示例:
for (int i = 1; i <= 10; i++) {if (i == 5)break;printf("%d ", i);
}
// 输出:1 2 3 4
2. continue
语句
跳过当前循环的剩余部分,进入下一轮循环。
示例:
for (int i = 1; i <= 5; i++) {if (i == 3)continue;printf("%d ", i);
}
// 输出:1 2 4 5
3. goto
语句(不推荐使用)
用于无条件跳转到程序中的某个标签位置。
示例:
int i = 1;
loop:
if (i <= 5) {printf("%d ", i);i++;goto loop;
}
// 输出:1 2 3 4 5
⚠️
goto
会使程序结构混乱,建议尽量避免使用。
五、总结对比表
控制结构 | 用途 | 是否需要条件 | 是否循环 |
---|---|---|---|
if | 单条件判断 | ✅ | ❌ |
if-else | 二选一 | ✅ | ❌ |
if-else if-else | 多条件判断 | ✅ | ❌ |
switch-case | 多分支选择 | ✅(整型) | ❌ |
for | 已知次数的循环 | ✅ | ✅ |
while | 条件驱动的循环 | ✅ | ✅ |
do-while | 至少执行一次的循环 | ✅ | ✅ |
break | 跳出循环或 switch | ❌ | ❌ |
continue | 跳过当前循环体继续下一轮 | ❌ | ✅ |
goto | 无条件跳转(不推荐) | ❌ | ❌ |
示例:嵌套循环打印星号三角形
#include <stdio.h>int main() {int i, j, rows;printf("请输入要打印的行数:");scanf("%d", &rows);// 外层循环控制行数for (i = 1; i <= rows; i++) {// 内层循环控制每行打印的星号个数for (j = 1; j <= i; j++) {printf("* ");}// 每行打印完后换行printf("\n");}return 0;
}
示例说明:
- 外层
for
循环(i
)控制总共有多少行。 - 内层
for
循环(j
)控制每一行打印多少个*
。 - 每打印完一行就换行(
printf("\n")
)。
示例输出(假设用户输入 5):
*
* *
* * *
* * * *
* * * * *
使用标志变量的例子:
#include <stdio.h>int main() {int shouldBreak = 0;for (int i = 1; i <= 3 && !shouldBreak; i++) {printf("外层循环: %d\n", i);for (int j = 1; j <= 3; j++) {if (j == 2) {printf("准备跳出所有循环。\n");shouldBreak = 1;break;}printf("内层循环: %d\n", j);}}return 0;
}
这个例子中,我们引入了一个名为 shouldBreak
的标志变量,在需要跳出所有循环时将其设为 1
,并在外层循环条件中检查该变量的值。