Skip to content

control flow.c

文件信息

  • 📄 原文件:02_control_flow.c
  • 🔤 语言:c

完整代码

c
// ============================================================
//                      流程控制
// ============================================================
// C 的流程控制与大多数语言相同:if/else、switch、for、while
// C 特有:goto 语句(可用于跳出多层嵌套,需谨慎使用)
// 条件表达式:0 为假,任意非 0 值为真

#include <stdio.h>
#include <stdbool.h>

int main(void) {
    printf("=== 条件语句 ===\n");

    // ----------------------------------------------------------
    // 1. if / else if / else
    // ----------------------------------------------------------
    int score = 85;

    if (score >= 90) {
        printf("优秀\n");
    } else if (score >= 80) {
        printf("良好\n");       // 命中此分支
    } else if (score >= 60) {
        printf("及格\n");
    } else {
        printf("不及格\n");
    }

    // 三元运算符(条件表达式)
    const char *result = (score >= 60) ? "通过" : "未通过";
    printf("结果: %s\n", result);

    // C 中任何非 0 值都是真
    int x = 5;
    if (x)       printf("x 非零(真)\n");
    if (!0)      printf("!0 为真\n");
    if (x > 3)   printf("x > 3\n");

    // ----------------------------------------------------------
    // 2. switch 语句
    // ----------------------------------------------------------
    printf("\n=== switch ===\n");

    int day = 3;
    switch (day) {
        case 1:
            printf("周一\n");
            break;  // 必须 break,否则会贯穿(fall-through)
        case 2:
            printf("周二\n");
            break;
        case 3:
        case 4:
        case 5:
            // 多个 case 共享同一处理逻辑
            printf("工作日(第 %d 天)\n", day);
            break;
        case 6:
        case 7:
            printf("周末\n");
            break;
        default:
            printf("无效\n");
    }

    // 【特性】有意为之的贯穿(fall-through)
    printf("\n贯穿示例(case 1 -> 2 -> 3):\n");
    int val = 1;
    switch (val) {
        case 1: printf("  case 1\n"); /* 故意不 break */
        case 2: printf("  case 2\n"); /* 故意不 break */
        case 3: printf("  case 3\n"); break;
        default: printf("  default\n");
    }

    // ----------------------------------------------------------
    // 3. for 循环
    // ----------------------------------------------------------
    printf("\n=== for 循环 ===\n");

    // 标准 for 循环
    for (int i = 0; i < 5; i++) {
        printf("%d ", i);
    }
    printf("\n");

    // 倒序
    for (int i = 5; i > 0; i--) {
        printf("%d ", i);
    }
    printf("\n");

    // 步长为 2
    for (int i = 0; i <= 10; i += 2) {
        printf("%d ", i);
    }
    printf("\n");

    // 嵌套循环(九九乘法表)
    printf("\n九九乘法表:\n");
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            printf("%d×%d=%-3d", j, i, i * j);
        }
        printf("\n");
    }

    // ----------------------------------------------------------
    // 4. while 循环
    // ----------------------------------------------------------
    printf("\n=== while ===\n");

    int n = 1;
    while (n <= 5) {
        printf("%d ", n++);  // n++ 后置递增
    }
    printf("\n");

    // 无限循环(常见于嵌入式/服务器)
    // while (1) { ... }  // 或 for (;;) { ... }

    // ----------------------------------------------------------
    // 5. do-while 循环(至少执行一次)
    // ----------------------------------------------------------
    printf("\n=== do-while ===\n");

    int m = 0;
    do {
        printf("%d ", m);
        m++;
    } while (m < 3);
    printf("\n");

    // 【用途】用于需要先执行后判断的场景(如菜单选择)
    // do {
    //     printf("请选择(1-3): ");
    //     scanf("%d", &choice);
    // } while (choice < 1 || choice > 3);

    // ----------------------------------------------------------
    // 6. break / continue / goto
    // ----------------------------------------------------------
    printf("\n=== break / continue ===\n");

    // break:跳出当前循环
    for (int i = 0; i < 10; i++) {
        if (i == 5) break;
        printf("%d ", i);
    }
    printf("(break at 5)\n");

    // continue:跳过本次迭代
    for (int i = 0; i < 10; i++) {
        if (i % 2 == 0) continue;  // 跳过偶数
        printf("%d ", i);
    }
    printf("(奇数)\n");

    // break 只跳出一层循环,使用标志变量或 goto 跳出多层
    printf("\n跳出多层循环(使用 goto):\n");
    bool found = false;
    for (int i = 0; i < 5 && !found; i++) {
        for (int j = 0; j < 5; j++) {
            if (i * j == 6) {
                printf("找到:%d × %d = 6\n", i, j);
                found = true;
                break;
            }
        }
    }

    // goto(C 的特殊跳转,错误处理时常用)
    printf("\ngoto 示例(资源清理模式):\n");
    int *ptr = NULL;
    // 模拟分配失败场景
    if (ptr == NULL) {
        printf("  分配失败,跳到清理代码\n");
        goto cleanup;  // 跳转到 cleanup 标签
    }
    printf("  这行不会执行\n");

cleanup:
    printf("  执行清理操作(goto 目标)\n");
    // 在实际代码中这里释放资源:free(ptr);

    // ----------------------------------------------------------
    // 7. 逻辑运算符
    // ----------------------------------------------------------
    printf("\n=== 逻辑运算符 ===\n");

    int age = 25;
    bool has_id = true;

    // && (AND)、|| (OR)、! (NOT)
    if (age >= 18 && has_id) {
        printf("可以入场\n");
    }

    // 短路求值:&& 左侧为假时右侧不执行,|| 左侧为真时右侧不执行
    int divisor = 0;
    if (divisor != 0 && 10 / divisor > 2) {
        printf("条件成立\n");
    } else {
        printf("安全避免了除零(短路求值)\n");
    }

    // 位运算符(作用于整数的每一位)
    printf("\n=== 位运算 ===\n");
    unsigned int flags = 0;
    unsigned int FLAG_READ    = 0x01;  // 0001
    unsigned int FLAG_WRITE   = 0x02;  // 0010
    unsigned int FLAG_EXECUTE = 0x04;  // 0100

    flags |= FLAG_READ | FLAG_WRITE;  // 设置位:OR
    printf("设置读写权限: 0x%02X\n", flags);

    if (flags & FLAG_READ) printf("可读\n");
    if (flags & FLAG_WRITE) printf("可写\n");
    if (!(flags & FLAG_EXECUTE)) printf("不可执行\n");

    flags &= ~FLAG_WRITE;  // 清除位:AND NOT
    printf("清除写权限后: 0x%02X\n", flags);

    flags ^= FLAG_EXECUTE;  // 翻转位:XOR
    printf("翻转执行位: 0x%02X\n", flags);

    // 移位运算
    printf("\n移位运算:\n");
    int a = 1;
    printf("1 << 3 = %d(乘以8)\n", a << 3);
    printf("16 >> 2 = %d(除以4)\n", 16 >> 2);

    printf("\n=== 流程控制演示完成 ===\n");
    return 0;
}

💬 讨论

使用 GitHub 账号登录后即可参与讨论

基于 MIT 许可发布