本节重点讲述控制语句关键字,如果想详细了解关键字的同学点击下方链接进行跳转
1-1 C语言 - 关键字及其使用(数据类型)-CSDN博客
目录
if 和 else:
- 注意事项:
- 确保条件表达式能正确地返回布尔值。
else
分支是可选的,但如果使用,应确保其逻辑与if
相对应。
- 易出错地方:
- 忘记写大括号
{}
,在只有一行代码时可能会误以为多行代码都属于if
或else
块。 - 条件表达式的优先级不清楚,可能导致错误的判断。建议使用括号明确优先级。
- 忘记写大括号
int x = 5;
if (x = 10) { // 错误:这里是赋值,而不是比较
printf("x等于10\n");
}
switch 和 case:
- 注意事项:
case
标签后面的值必须是常量表达式。- 每个
case
标签后面通常需要一个break
语句,否则会导致“贯穿效应”(fall-through)。 default
标签是可选的,但建议使用以处理所有未覆盖的情况。
- 易出错地方:
- 忘记在
case
结束时使用break
,导致意外执行后续case
。 switch
语句中的表达式类型与case
标签的类型不匹配。
- 忘记在
int y = 2;
switch (y) {
case 1:
printf("y等于1\n");
case 2:
printf("y等于2\n"); // 错误:忘记break,会继续执行default
default:
printf("y不等于1也不等于2\n");
}
for、while 和 do-while 循环:
- 注意事项:
- 确保循环条件能够在某个时刻变为
false
,否则会导致无限循环。 - 初始化语句和更新表达式应正确设置和更新循环控制变量。
- 确保循环条件能够在某个时刻变为
- 易出错地方:
- 忘记在循环内部更新循环控制变量,导致无限循环。
- 循环条件写错,导致循环无法正常执行。
for (int i = 0; i < 10; ) { // 错误:没有更新i,导致无限循环
printf("i是%d\n", i);
}
break 和 continue:
- 注意事项:
break
语句用于跳出最近的for
、while
或switch
语句。continue
语句用于跳过当前循环的剩余部分并开始下一次循环迭代。
- 易出错地方:
- 误用
break
和continue
,例如在不恰当的地方使用它们。 - 忘记使用大括号
{}
包含continue
后面的代码,导致逻辑错误。
- 误用
for (int i = 0; i < 10; i++) {
if (i == 5) {
continue; // 跳过i等于5时的输出
}
printf("i是%d\n", i);
}
goto:
- 注意事项:
- 尽量避免使用
goto
,因为它会导致代码难以阅读和维护。 - 确保
goto
跳转的标签存在且合理。
- 尽量避免使用
- 易出错地方:
- 滥用
goto
导致“意大利面条”代码(代码乱而难以理解)。 - 忘记定义或误拼标签名称。
- 滥用
int m = 0;
if (m == 0) {
goto label; // 确保label存在
}
printf("这段代码不会被执行\n");
label:
printf("跳转到了这里\n");
嵌套循环和条件语句:
- 注意事项:
- 在嵌套循环或条件语句中,注意不同层次的控制流,确保每个循环和条件块的逻辑清晰。
- 使用合适的缩进和注释来提高代码的可读性。
- 易出错地方:
- 混淆内外层循环或条件语句的变量,导致逻辑错误。
- 在内层循环中意外修改外层循环控制变量。
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == j) {
printf("i等于j: %d\n", i);
} else {
printf("i不等于j: %d, %d\n", i, j);
}
}
}
多分支选择中的复杂条件:
- 注意事项:
- 当有多个条件需要判断时,可以使用嵌套的
if-else
语句或者switch
语句,但应确保逻辑清晰且不冗余。 - 在
switch
语句中,合理使用break
和default
来处理所有可能的情况。
- 当有多个条件需要判断时,可以使用嵌套的
- 易出错地方:
- 条件判断不全面,遗漏某些情况。
- 使用嵌套的
if-else
时,嵌套层次过深,导致代码难以维护。
char grade = 'B';
switch (grade) {
case 'A':
printf("优秀\n");
break;
case 'B':
case 'C':
printf("良好\n");
break;
case 'D':
printf("及格\n");
break;
default:
printf("不及格\n");
break;
}
正确处理循环中的资源管理:
- 注意事项:
- 在循环中使用资源(如文件、内存分配等)时,应确保每次迭代正确地分配和释放资源。
- 使用
break
或continue
时,应注意资源的清理,以避免资源泄漏。
- 易出错地方:
- 忘记在循环结束后释放资源,导致资源泄漏。
- 在使用
break
或continue
跳出循环时,没有正确释放已分配的资源。
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
// 处理文件打开失败
return -1;
}
char buffer[256];
while (fgets(buffer, sizeof(buffer), file) != NULL) {
if (buffer[0] == '#') {
// 跳过注释行
continue;
}
// 处理读取的行
printf("读取行: %s", buffer);
}
fclose(file); // 关闭文件,释放资源