控制流跳转

程序的流程控制

控制流跳转语句用于改变程序的正常执行流程,实现更灵活的程序控制。东巴文(db-w.cn) 将带你深入理解C语言的控制流跳转语句,掌握程序流程控制的高级技能。

💡 东巴文观点:控制流跳转语句是程序的导航,通过跳转语句,程序可以灵活地改变执行路径。

控制流跳转概述

什么是控制流跳转?

控制流跳转语句用于无条件地改变程序的执行流程,跳转到指定的代码位置。

东巴文控制流跳转分类

控制流跳转语句
├── break语句
│   └── 跳出循环或switch语句
├── continue语句
│   └── 跳过本次循环,继续下一次
├── goto语句
│   └── 无条件跳转到标签
└── return语句
    └── 从函数返回

break语句

基本概念

东巴文说明break 语句用于跳出当前的循环或 switch 语句。

在循环中使用

#include <stdio.h>

int main() {
    printf("=== 东巴文break语句示例 ===\n\n");
    
    // 在for循环中使用break
    printf("在for循环中使用break:\n");
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            printf("遇到5,跳出循环\n");
            break;
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // 在while循环中使用break
    printf("\n在while循环中使用break:\n");
    int i = 1;
    while (i <= 10) {
        if (i == 5) {
            printf("遇到5,跳出循环\n");
            break;
        }
        printf("%d ", i);
        i++;
    }
    printf("\n");
    
    // 在do-while循环中使用break
    printf("\n在do-while循环中使用break:\n");
    i = 1;
    do {
        if (i == 5) {
            printf("遇到5,跳出循环\n");
            break;
        }
        printf("%d ", i);
        i++;
    } while (i <= 10);
    printf("\n");
    
    return 0;
}

在switch中使用

#include <stdio.h>

int main() {
    int day = 3;
    
    printf("=== 东巴文break在switch中的应用 ===\n\n");
    
    // 有break的情况
    printf("有break:\n");
    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        default:
            printf("周末\n");
            break;
    }
    
    // 没有break的情况(case穿透)
    printf("\n没有break(case穿透):\n");
    switch (day) {
        case 1:
            printf("星期一\n");
        case 2:
            printf("星期二\n");
        case 3:
            printf("星期三\n");
        case 4:
            printf("星期四\n");
        case 5:
            printf("星期五\n");
        default:
            printf("周末\n");
    }
    
    return 0;
}

跳出嵌套循环

#include <stdio.h>

int main() {
    printf("=== 东巴文跳出嵌套循环 ===\n\n");
    
    // break只能跳出内层循环
    printf("break只能跳出内层循环:\n");
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
            if (i == 2 && j == 2) {
                printf("跳出内层循环\n");
                break;
            }
            printf("(%d, %d) ", i, j);
        }
        printf("\n");
    }
    
    // 使用标志变量跳出多层循环
    printf("\n使用标志变量跳出多层循环:\n");
    int found = 0;
    for (int i = 1; i <= 3 && !found; i++) {
        for (int j = 1; j <= 3 && !found; j++) {
            if (i == 2 && j == 2) {
                printf("找到目标,跳出所有循环\n");
                found = 1;
            } else {
                printf("(%d, %d) ", i, j);
            }
        }
        printf("\n");
    }
    
    return 0;
}

break的应用场景

#include <stdio.h>

int main() {
    // 查找第一个满足条件的元素
    int arr[] = {3, 7, 2, 9, 5, 8, 1, 6, 4, 0};
    int target = 5;
    int found = 0;
    int index = -1;
    
    for (int i = 0; i < 10; i++) {
        if (arr[i] == target) {
            found = 1;
            index = i;
            break;  // 找到后立即退出
        }
    }
    
    if (found) {
        printf("找到%d,位置:%d\n", target, index);
    } else {
        printf("未找到%d\n", target);
    }
    
    // 判断素数
    int num = 17;
    int isPrime = 1;
    
    for (int i = 2; i < num; i++) {
        if (num % i == 0) {
            isPrime = 0;
            break;  // 找到因子,不是素数
        }
    }
    
    if (isPrime && num > 1) {
        printf("%d是素数\n", num);
    } else {
        printf("%d不是素数\n", num);
    }
    
    return 0;
}

continue语句

基本概念

东巴文说明continue 语句用于跳过本次循环的剩余语句,继续下一次循环。

在循环中使用

#include <stdio.h>

int main() {
    printf("=== 东巴文continue语句示例 ===\n\n");
    
    // 在for循环中使用continue
    printf("在for循环中使用continue:\n");
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            printf("跳过5\n");
            continue;
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // 在while循环中使用continue
    printf("\n在while循环中使用continue:\n");
    int i = 0;
    while (i < 10) {
        i++;
        if (i == 5) {
            printf("跳过5\n");
            continue;
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // 在do-while循环中使用continue
    printf("\n在do-while循环中使用continue:\n");
    i = 0;
    do {
        i++;
        if (i == 5) {
            printf("跳过5\n");
            continue;
        }
        printf("%d ", i);
    } while (i < 10);
    printf("\n");
    
    return 0;
}

continue的应用场景

#include <stdio.h>

int main() {
    // 只处理偶数
    printf("1到20中的偶数:\n");
    for (int i = 1; i <= 20; i++) {
        if (i % 2 != 0) {
            continue;  // 跳过奇数
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // 过滤特定数据
    printf("\n过滤负数:\n");
    int arr[] = {3, -7, 2, -9, 5, -8, 1, 6, -4, 0};
    int sum = 0;
    
    for (int i = 0; i < 10; i++) {
        if (arr[i] < 0) {
            continue;  // 跳过负数
        }
        sum += arr[i];
        printf("%d ", arr[i]);
    }
    printf("\n正数和:%d\n", sum);
    
    // 跳过特定字符
    printf("\n过滤空格:\n");
    char str[] = "Hello World";
    for (int i = 0; str[i] != '\0'; i++) {
        if (str[i] == ' ') {
            continue;  // 跳过空格
        }
        printf("%c", str[i]);
    }
    printf("\n");
    
    return 0;
}

break vs continue

#include <stdio.h>

int main() {
    printf("=== 东巴文break vs continue ===\n\n");
    
    // break:跳出整个循环
    printf("使用break:\n");
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            break;  // 遇到5就退出循环
        }
        printf("%d ", i);
    }
    printf("\n");
    
    // continue:跳过本次循环
    printf("\n使用continue:\n");
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            continue;  // 跳过5,继续下一次
        }
        printf("%d ", i);
    }
    printf("\n");
    
    return 0;
}

东巴文对比表

特性 break continue 东巴文说明
作用 跳出循环 跳过本次循环 break更彻底
循环次数 减少循环次数 不改变循环次数 continue只跳过一次
使用场景 找到目标,提前退出 过滤特定数据 根据需求选择
switch 可以使用 不能使用 continue只在循环中有效

goto语句

基本概念

东巴文说明goto 语句用于无条件跳转到指定的标签位置。

基本语法

goto 标签名;

标签名:
    // 代码

示例代码

#include <stdio.h>

int main() {
    printf("=== 东巴文goto语句示例 ===\n\n");
    
    // 基本使用
    printf("基本使用:\n");
    int i = 1;
    
start:
    printf("%d ", i);
    i++;
    
    if (i <= 5) {
        goto start;
    }
    printf("\n");
    
    // 跳出多层循环
    printf("\n跳出多层循环:\n");
    for (int i = 1; i <= 3; i++) {
        for (int j = 1; j <= 3; j++) {
            if (i == 2 && j == 2) {
                printf("跳出所有循环\n");
                goto end;
            }
            printf("(%d, %d) ", i, j);
        }
        printf("\n");
    }
    
end:
    printf("程序结束\n");
    
    return 0;
}

goto的应用场景

#include <stdio.h>

int main() {
    // 错误处理
    printf("=== 东巴文错误处理示例 ===\n\n");
    
    int a = 10, b = 0;
    
    if (b == 0) {
        printf("错误:除数不能为0\n");
        goto error;
    }
    
    int result = a / b;
    printf("结果:%d\n", result);
    goto success;
    
error:
    printf("计算失败\n");
    return -1;
    
success:
    printf("计算成功\n");
    return 0;
}

goto的缺点

#include <stdio.h>

// ❌ 不推荐:过度使用goto,代码难以理解
int main() {
    int i = 0;
    
label1:
    i++;
    if (i > 10) goto label4;
    
label2:
    printf("%d ", i);
    if (i % 2 == 0) goto label3;
    goto label1;
    
label3:
    i++;
    goto label2;
    
label4:
    printf("\n");
    return 0;
}

// ✅ 推荐:使用循环,代码清晰
int main_better() {
    for (int i = 1; i <= 10; i++) {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

东巴文警告

  • goto 会破坏程序的结构化
  • 过度使用会导致代码难以理解和维护
  • 应该尽量避免使用 goto
  • 只在特殊场景使用(如跳出多层循环、错误处理)

return语句

基本概念

东巴文说明return 语句用于从函数返回,可以携带返回值。

基本语法

return;          // 不返回值
return 表达式;   // 返回值

示例代码

#include <stdio.h>

// 无返回值函数
void printMessage() {
    printf("东巴文欢迎您!\n");
    return;  // 可以省略
}

// 有返回值函数
int add(int a, int b) {
    return a + b;
}

// 提前返回
int max(int a, int b) {
    if (a > b) {
        return a;
    }
    return b;
}

// 错误处理
int divide(int a, int b, int *result) {
    if (b == 0) {
        return -1;  // 返回错误码
    }
    *result = a / b;
    return 0;  // 返回成功
}

int main() {
    printf("=== 东巴文return语句示例 ===\n\n");
    
    // 调用无返回值函数
    printMessage();
    
    // 调用有返回值函数
    int sum = add(5, 3);
    printf("5 + 3 = %d\n", sum);
    
    // 调用提前返回函数
    int m = max(10, 5);
    printf("max(10, 5) = %d\n", m);
    
    // 调用错误处理函数
    int result;
    if (divide(10, 2, &result) == 0) {
        printf("10 / 2 = %d\n", result);
    } else {
        printf("除法失败\n");
    }
    
    if (divide(10, 0, &result) == 0) {
        printf("10 / 0 = %d\n", result);
    } else {
        printf("除法失败:除数为0\n");
    }
    
    return 0;
}

return的应用场景

#include <stdio.h>

// 参数验证
double sqrt_approximate(double n) {
    if (n < 0) {
        printf("错误:不能对负数开方\n");
        return -1;  // 返回错误值
    }
    
    // 简单的平方根近似算法
    double x = n;
    for (int i = 0; i < 10; i++) {
        x = (x + n / x) / 2;
    }
    return x;
}

// 查找元素
int findElement(int arr[], int size, int target) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == target) {
            return i;  // 找到,返回索引
        }
    }
    return -1;  // 未找到,返回-1
}

// 判断素数
int isPrime(int n) {
    if (n <= 1) return 0;
    if (n <= 3) return 1;
    if (n % 2 == 0 || n % 3 == 0) return 0;
    
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) {
            return 0;
        }
    }
    return 1;
}

int main() {
    printf("=== 东巴文return应用示例 ===\n\n");
    
    // 平方根
    double result = sqrt_approximate(16);
    if (result >= 0) {
        printf("sqrt(16) ≈ %.2f\n", result);
    }
    
    // 查找元素
    int arr[] = {3, 7, 2, 9, 5};
    int index = findElement(arr, 5, 9);
    if (index >= 0) {
        printf("找到9,位置:%d\n", index);
    } else {
        printf("未找到9\n");
    }
    
    // 判断素数
    int num = 17;
    if (isPrime(num)) {
        printf("%d是素数\n", num);
    } else {
        printf("%d不是素数\n", num);
    }
    
    return 0;
}

东巴文最佳实践

1. 合理使用break

// ✅ 找到目标后立即退出
for (int i = 0; i < size; i++) {
    if (arr[i] == target) {
        printf("找到目标\n");
        break;
    }
}

// ✅ 条件满足时退出
while (1) {
    // 处理逻辑
    if (condition) {
        break;
    }
}

2. 合理使用continue

// ✅ 过滤特定数据
for (int i = 1; i <= 100; i++) {
    if (i % 2 != 0) {
        continue;  // 跳过奇数
    }
    printf("%d ", i);
}

// ✅ 跳过无效数据
for (int i = 0; i < size; i++) {
    if (arr[i] < 0) {
        continue;  // 跳过负数
    }
    // 处理有效数据
}

3. 避免使用goto

// ❌ 不推荐:使用goto
int main() {
    int i = 0;
loop:
    printf("%d ", i);
    i++;
    if (i < 10) goto loop;
    return 0;
}

// ✅ 推荐:使用循环
int main() {
    for (int i = 0; i < 10; i++) {
        printf("%d ", i);
    }
    return 0;
}

4. 合理使用return

// ✅ 提前返回,减少嵌套
int process(int value) {
    if (value < 0) {
        return -1;  // 错误情况提前返回
    }
    
    if (value == 0) {
        return 0;  // 特殊情况提前返回
    }
    
    // 正常处理
    return value * 2;
}

// ✅ 错误处理
int readFile(const char *filename) {
    FILE *fp = fopen(filename, "r");
    if (fp == NULL) {
        return -1;  // 文件打开失败
    }
    
    // 读取文件
    fclose(fp);
    return 0;  // 成功
}

东巴文验证清单

完成本章学习后,请确认:

  • 理解控制流跳转语句的概念
  • 掌握break语句的使用
  • 掌握continue语句的使用
  • 了解goto语句的使用
  • 掌握return语句的使用
  • 理解break和continue的区别
  • 了解goto的缺点
  • 掌握控制流跳转语句的最佳实践

下一步学习

掌握控制流跳转语句后,你可以继续学习:

如果遇到问题,欢迎访问 东巴文(db-w.cn) 获取帮助!


东巴文(db-w.cn) - 让编程学习更简单

📦 东巴文控制流跳转提示:控制流跳转语句是程序的控制中心,掌握跳转语句是编写灵活程序的关键。在 db-w.cn,我们会通过大量实例帮你掌握控制流跳转语句的使用!