C语言分支与循环

发布于:2025-06-11 ⋅ 阅读:(18) ⋅ 点赞:(0)


前言

在C语言中,分支和循环是控制程序流程的核心结构。分支语句(如if-elseswitch)允许程序根据条件选择不同的执行路径,而循环语句(如forwhiledo-while)则用于重复执行特定代码块。掌握这些结构是编写高效、灵活程序的基础。


一、分支结构

分支结构是程序根据条件判断选择不同执行路径的结构,C语言中主要有以下几种分支结构:

1. if语句

基本形式:

if (条件表达式) {
    // 条件为真时执行的代码
}

示例:

int score = 85;
if (score >= 60) {
    printf("及格\n");
}

2. if-else语句

基本形式:

if (条件表达式) {
    // 条件为真时执行的代码
} else {
    // 条件为假时执行的代码
}

示例:

int age = 18;
if (age >= 18) {
    printf("成年人\n");
} else {
    printf("未成年人\n");
}

3. else-if语句

基本形式:

if (条件1) {
    // 条件1为真时执行的代码
} else if (条件2) {
    // 条件2为真时执行的代码
} else {
    // 以上条件都不满足时执行的代码
}

示例:

int score = 75;
if (score >= 90) {
    printf("优秀\n");
} else if (score >= 80) {
    printf("良好\n");
} else if (score >= 60) {
    printf("及格\n");
} else {
    printf("不及格\n");
}

注意条件语句的括号必须完整配对,避免因遗漏括号导致逻辑错误

嵌套过深的 if else 会降低代码可读性,建议通过提前返回或拆分逻辑简化

多重独立 if 可能导致多个分支被执行,而 elif 确保只有一个分支执行。

空 else 块可能掩盖逻辑意图,建议注释或明确处理。

4. switch语句

switch 语句的表达式只能是整数类型(如 intcharenum)或可以转换为整数类型的表达式。C++ 中允许使用字符串类型,但 C 语言不支持。

基本形式:

switch (表达式) {
    case 常量1:
        // 代码块1
        break;
    case 常量2:
        // 代码块2
        break;
    // ...
    default:
        // 默认代码块
}

示例:

int day = 3;
switch (day) {
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    case 3:
        printf("星期三\n");
        break;
    // ...
    default:
        printf("无效的输入\n");
}

注意:每个 case 分支通常需要 break 语句来终止当前分支的执行。若缺少 break,程序会继续执行后续 case 分支的代码(称为"fall-through"现象)

default 分支用于处理未匹配任何 case 的情况。虽然可选,但建议始终包含 default 分支以提高代码健壮性。

同一个 switch 语句中,所有 case 的值必须是唯一的。重复的 case 值会导致编译错误

在 case 分支中直接声明变量可能导致编译错误。如果需要声明变量,应该使用块作用域。

switch (x) {
    case 1:
        int y = 10;  // 可能产生编译错误
        break;
    case 2:
        { // 使用块作用域
            int z = 20;  // 正确
        }
        break;
}

二、循环结构

循环结构用于重复执行某段代码,C语言提供了以下几种循环结构:

1. while循环

while循环是一种在满足特定条件时重复执行代码块的控制结构。其核心逻辑是条件判断,只要条件为真,循环就会持续执行。

基本形式:

while (条件表达式) {
    // 循环体
}

示例:

int i = 1;
while (i <= 5) {
    printf("%d ", i);
    i++;
}
// 输出:1 2 3 4 5

循环变量需要在循环前正确初始化,并在循环体内适时更新。忽略变量更新会导致逻辑错误或无限循环。还要注意while(里面可能直接进行复值操作)导致死循环

2. do-while循环

基本形式:

do {
    // 循环体
} while (条件表达式);

示例:

int i = 1;
do {
    printf("%d ", i);
    i++;
} while (i <= 5);
// 输出:1 2 3 4 5

与while的区别:

  • do-while至少执行一次循环体

  • while可能一次都不执行

3. for循环

for循环是一种常用的迭代结构,用于重复执行代码块,直到满足特定条件。通常用于遍历序列(如列表、字符串、字典等)或执行固定次数的操作。

基本形式:

for (初始化表达式; 条件表达式; 更新表达式) {
    // 循环体
}

示例:

for (int i = 1; i <= 5; i++) {
    printf("%d ", i);
}
// 输出:1 2 3 4 5

for循环的执行顺序:

  1. 执行初始化表达式

  2. 判断条件表达式

  3. 若条件为真,执行循环体

  4. 执行更新表达式

  5. 回到第2步

4. 嵌套循环

循环可以嵌套使用,形成多重循环:

示例:

// 打印九九乘法表
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        printf("%d*%d=%-2d ", j, i, i*j);
    }
    printf("\n");
}

三、循环控制语句

1. break语句

用于跳出当前循环或switch结构:

示例:

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;  // 当i等于5时跳出循环
    }
    printf("%d ", i);
}
// 输出:1 2 3 4

2. continue语句

跳过当前循环的剩余部分,直接进入下一次循环:

示例:

for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue;  // 跳过i=3时的循环
    }
    printf("%d ", i);
}
// 输出:1 2 4 5

3. goto语句

goto语句是一种控制流语句,允许程序无条件跳转到代码中的指定标签位置。它在许多编程语言中存在,但使用场景和争议较多。

无条件跳转到指定标签处:

示例:

int i = 0;
start:
    printf("%d ", i);
    i++;
    if (i < 5) {
        goto start;
    }
// 输出:0 1 2 3 4

仅在没有更好结构化替代方案时考虑使用 限制在小型函数或特定算法中使用 添加充分注释说明跳转逻辑 避免交叉跳转和逆向跳转

四、综合应用示例

示例1:判断素数

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

bool isPrime(int num) {
    if (num <= 1) return false;
    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);
    
    if (isPrime(num)) {
        printf("%d是素数\n", num);
    } else {
        printf("%d不是素数\n", num);
    }
    
    return 0;
}

示例2:计算阶乘

#include <stdio.h>

int main() {
    int n;
    long long factorial = 1;
    
    printf("请输入一个正整数:");
    scanf("%d", &n);
    
    if (n < 0) {
        printf("负数没有阶乘\n");
    } else {
        for (int i = 1; i <= n; i++) {
            factorial *= i;
        }
        printf("%d的阶乘是%lld\n", n, factorial);
    }
    
    return 0;
}

示例3:斐波那契数列

#include <stdio.h>

int main() {
    int n, t1 = 0, t2 = 1, nextTerm;
    
    printf("请输入项数:");
    scanf("%d", &n);
    
    printf("斐波那契数列:");
    
    for (int i = 1; i <= n; i++) {
        printf("%d ", t1);
        nextTerm = t1 + t2;
        t1 = t2;
        t2 = nextTerm;
    }
    
    return 0;
}

五、注意事项

  1. 避免死循环:确保循环条件最终能变为假

// 错误示例 - 死循环
while (1) {
    // 缺少退出条件
}

浮点数比较:不要直接用==比较浮点数

// 正确做法
double a = 0.1 + 0.2;
if (fabs(a - 0.3) < 0.000001) {
    // 认为相等
}

switch-case中的break:忘记break会导致case穿透

switch (x) {
    case 1:
        printf("1");
        // 忘记break
    case 2:
        printf("2");  // 当x=1时,会执行到这里
        break;
}

总结

C语言的分支结构主要通过ifelse ifelseswitch语句实现。if用于单条件判断,else ifelse扩展多条件分支,switch适用于多路选择,常与casebreak配合使用。

循环结构包括whiledo-whileforwhile先判断条件后执行,do-while先执行后判断,for适合已知循环次数的情况。break终止循环,continue跳过当前迭代。

分支和循环是程序逻辑控制的核心,合理使用能提升代码效率和可读性。