1-3 C语言 - 控制语句的使用注意事项(这些绝对是您经常出错的地方)

本节重点讲述控制语句关键字,如果想详细了解关键字的同学点击下方链接进行跳转

1-1 C语言 - 关键字及其使用(数据类型)-CSDN博客

1-2 C语言 - 控制语句关键字-CSDN博客

目录

if 和 else:

switch 和 case:

for、while 和 do-while 循环:

break 和 continue:

goto:

嵌套循环和条件语句:

多分支选择中的复杂条件:

正确处理循环中的资源管理:


ifelse

  • 注意事项
    • 确保条件表达式能正确地返回布尔值
    • else 分支是可选的,但如果使用,应确保其逻辑与 if 相对应
  • 易出错地方
    • 忘记写大括号 {},在只有一行代码时可能会误以为多行代码都属于 ifelse 块。
    • 条件表达式的优先级不清楚,可能导致错误的判断。建议使用括号明确优先级。
int x = 5;
if (x = 10) { // 错误:这里是赋值,而不是比较
    printf("x等于10\n");
}

switchcase

  • 注意事项
    • 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");
}

forwhiledo-while 循环:

  • 注意事项
    • 确保循环条件能够在某个时刻变为 false,否则会导致无限循环。
    • 初始化语句和更新表达式应正确设置和更新循环控制变量。
  • 易出错地方
    • 忘记在循环内部更新循环控制变量,导致无限循环。
    • 循环条件写错,导致循环无法正常执行。
for (int i = 0; i < 10; ) { // 错误:没有更新i,导致无限循环
    printf("i是%d\n", i);
}

breakcontinue

  • 注意事项
    • break 语句用于跳出最近的 forwhileswitch 语句。
    • continue 语句用于跳过当前循环的剩余部分并开始下一次循环迭代。
  • 易出错地方
    • 误用 breakcontinue,例如在不恰当的地方使用它们。
    • 忘记使用大括号 {} 包含 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 语句中,合理使用 breakdefault 来处理所有可能的情况。
  • 易出错地方
    • 条件判断不全面,遗漏某些情况。
    • 使用嵌套的 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;
}

正确处理循环中的资源管理

  • 注意事项
    • 在循环中使用资源(如文件、内存分配等)时,应确保每次迭代正确地分配和释放资源。
    • 使用 breakcontinue 时,应注意资源的清理,以避免资源泄漏。
  • 易出错地方
    • 忘记在循环结束后释放资源,导致资源泄漏。
    • 在使用 breakcontinue 跳出循环时,没有正确释放已分配的资源。
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); // 关闭文件,释放资源

  • 23
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值