C语言入门:分支与循环语句详解

C语言入门:分支与循环语句详解

一、为什么要学分支和循环?

程序如果只能从上到下顺序执行,功能会非常有限。实际开发中,我们需要程序具备"判断"和"重复"的能力:

  • 分支语句:让程序根据不同条件执行不同的代码路径("如果......就......否则......")。
  • 循环语句:让程序重复执行某段代码,直到满足退出条件("重复做......直到......")。

C语言提供了 if、switch 两个分支语句,以及 for、while、do...while 三个循环语句。下面通过几个经典例题,逐一讲解它们的用法。


二、分支语句

2.1 if 语句

if 是最基本的分支结构,语法如下:

arduino 复制代码
if (条件) {
    // 条件为真时执行
} else if (另一个条件) {
    // 另一个条件为真时执行
} else {
    // 以上条件都不满足时执行
}

例题1:

描述

KiKi想知道,已经给出的三条边 aa、bb、cc 能否构成一个非退化三角形,如果能构成,判断三角形的类型(等边三角形、等腰三角形或普通三角形)。

【名词解释】

非退化三角形:三条边长均大于 00 且任意两边之和均大于第三边的三角形。

输入描述:

在一行上输入三个整数 a,b,c(0<a,b,c<10)a,b,c(0<a,b,c<10),表示三角形的三条边。

输出描述:

在一行上输出一个字符串,表示三角形的类型,具体地:

∙ ∙如果三角形是等边三角形,则输出 Equilateral triangle!Equilateral triangle!;

∙ ∙如果三角形是等腰三角形,则输出 Isosceles triangle!Isosceles triangle!;

∙ ∙如果三角形是普通三角形,则输出 Ordinary triangle!Ordinary triangle!;

∙ ∙如果不能构成非退化三角形,则输出 Not a triangle!Not a triangle!。

示例1

输入:

复制代码
2 3 2

输出:

复制代码
Isosceles triangle!

示例2

输入:

复制代码
3 3 3

输出:

复制代码
Equilateral triangle!

示例3

输入:

复制代码
4 3 2

输出:

复制代码
Ordinary triangle!

示例4

输入:

复制代码
3 2 1

输出

css 复制代码
Not a triangle!

程序

C 复制代码
#include <stdio.h>
int main() {

    int a, b,c;

    while (scanf("%d %d %d", &a, &b,&c) != EOF) { // 注意 while 处理多个 case

        // 64 位输出请用 printf("%lld") to

        if (a+b>c&&a+c>b&&b+c>a){
            if(a==b&&b==c)  printf("Equilateral triangle!\n");
            else {
                if(a==b||a==c||b==c) printf("Isosceles triangle!\n");
                else printf("Ordinary triangle!\n");
            }
        }
        else printf("Not a triangle!\n");
    }
    return 0;
}

2.2 switch 语句

当需要根据一个变量的多个离散值做不同处理时,switch 比多层 if-else 更清晰:

arduino 复制代码
switch (变量) {
    case 值1:
        // 处理
        break;
    case 值2:
        // 处理
        break;
    default:
        // 默认处理
        break;
}

注意每个 case 后面要加 break,否则会"穿透"到下一个 case。


三、循环语句

3.1 for 循环

for 循环适合已知循环次数的场景,语法最紧凑:

scss 复制代码
for (初始化; 条件; 更新) {
    // 循环体
}

执行顺序:初始化 → 判断条件 → 执行循环体 → 更新 → 再判断条件 → ......

3.2 while 循环

while 循环适合不确定循环次数、只知道终止条件的场景:

arduino 复制代码
while (条件) {
    // 循环体
}

3.3 do...while 循环

do...while 至少执行一次循环体,再判断条件:

arduino 复制代码
do {
    // 循环体
} while (条件);

3.4 break 和 continue

  • break:立即跳出整个循环。
  • continue:跳过本次循环剩余代码,直接进入下一次循环的判断。

四、经典例题讲解

例题2:打印9×9乘法口诀表

这道题用双重 for 循环:外层控制行,内层控制列。

arduino 复制代码
#include <stdio.h>

int main() {
    int i, j;
    for (i = 1; i <= 9; i++) {
        for (j = 1; j <= i; j++) {
            printf("%d*%d=%-2d  ", j, i, i * j);
        }
        printf("\n");
    }
    return 0;
}

要点:%-2d 表示左对齐、占2位,让输出对齐更整齐。如果想输出完整方阵,把内层条件改成 j <= 9 即可。

例题3:求10个整数中的最大值

这道题用单层 for 循环遍历比较,是"打擂台"思想的典型应用。

arduino 复制代码
#include <stdio.h>

int main() {
    int i, num, max;

    printf("请输入10个整数:\n");
    scanf("%d", &max);          // 先读第1个作为初始最大值
    for (i = 1; i < 10; i++) {
        scanf("%d", &num);
        if (num > max) {        // 分支判断:遇到更大的就更新
            max = num;
        }
    }

    printf("最大值是:%d\n", max);
    return 0;
}

要点:先假设第一个数是最大值,然后逐个比较、更新。循环和分支在这里配合使用。

例题4:计算 1/1 - 1/2 + 1/3 - 1/4 + ... + 1/99 - 1/100

这道题用for 循环 + 符号变量,演示了循环体内做累加的技巧。

ini 复制代码
#include <stdio.h>

int main() {
    double sum = 0.0;
    int i;
    int sign = 1;  // 控制正负号

    for (i = 1; i <= 100; i++) {
        sum += sign * (1.0 / i);
        sign = -sign;  // 每次循环切换符号
    }

    printf("结果 = %f\n", sum);  // 输出约 0.688172
    return 0;
}

要点:

  • 必须写 1.0 / i,如果写 1 / i 会变成整数除法,i>1 时结果全为 0。
  • 用 sign 变量在 +1 和 -1 之间切换,比判断奇偶更简洁。

例题5:统计1到100中数字9出现的次数

这道题用for 循环 + 分支判断,演示了如何拆分各位数字。

ini 复制代码
#include <stdio.h>

int main() {
    int i;
    int count = 0;
    int ge, shi;

    for (i = 1; i <= 100; i++) {
        ge  = i % 10;       // 个位
        shi = i / 10 % 10;  // 十位

        if (ge == 9)  count++;
        if (shi == 9) count++;
    }

    printf("数字9出现了 %d 次\n", count);  // 输出 20
    return 0;
}

要点:注意是统计"数字9出现的次数",不是"含9的数的个数"。99 里有2个9,所以答案是 20 而不是 19。

例题6:打印100~200之间的素数

这道题用双重 for 循环 + break,是循环与分支综合运用的经典题。

ini 复制代码
#include <stdio.h>
#include <math.h>

int main() {
    int i, j;
    int isPrime;
    int count = 0;

    printf("100~200之间的素数:\n");
    for (i = 100; i <= 200; i++) {
        isPrime = 1;  // 先假设是素数
        for (j = 2; j <= (int)sqrt((double)i); j++) {
            if (i % j == 0) {
                isPrime = 0;
                break;   // 找到因子,立即跳出内层循环
            }
        }
        if (isPrime) {
            printf("%d ", i);
            count++;
        }
    }
    printf("\n共有 %d 个素数\n", count);  // 输出 21 个
    return 0;
}

要点:

  • 只需试除到 sqrt(i),效率远高于试除到 i-1。
  • 找到第一个因子就用 break 跳出,无需继续试除。
  • 编译时需加 -lm 链接数学库:gcc prime.c -o prime -lm。

例题7:打印1000年到2000年之间的闰年

这道题用for 循环 + 复合条件分支,演示了复杂逻辑条件的写法。

arduino 复制代码
#include <stdio.h>

int main() {
    int year;
    int count = 0;

    printf("1000年到2000年之间的闰年:\n");
    for (year = 1000; year <= 2000; year++) {
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            printf("%d ", year);
            count++;
        }
    }
    printf("\n共有 %d 个闰年\n", count);  // 输出 244 个
    return 0;
}

要点:闰年规则是"四年一闰,百年不闰,四百年再闰",翻译成代码就是 (year%4==0 && year%100!=0) || (year%400==0)。注意括号不能省,&& 优先级高于 ||。


五、小结

表格

语句 适用场景 关键特点
if-else 条件判断 最基础的分支
switch 多值匹配 代码更清晰,别忘 break
for 已知循环次数 初始化、条件、更新写在一行
while 未知次数、已知终止条件 先判断再执行
do-while 至少执行一次 先执行再判断
break 提前结束循环 跳出整个循环
continue 跳过本次 进入下一次循环判断

掌握这些语句后,已经可以解决大部分基础编程问题了。

相关推荐
传人1 小时前
macSvn 使用体验:Mac 上的 SVN 版本管理工具,真的比命令行方便吗?
程序员
crawler1 小时前
别再死磕纯技术了:2026 年程序员的 7 条真实出路
程序员
Tim0071 小时前
软考高项考下来:每月多600,还被推进数据局当专家(一次800)
程序员
高晶1 小时前
BMS 通信开发实战:从 PMBus 协议到数据采集的完整指南
设计模式·程序员
kyriewen2 小时前
我扒了 npm 三年数据:AI 没把依赖变胖,是把包变多了
前端·人工智能·程序员
臻选云栗子5 小时前
PCDN跑不起来?先别甩锅给平台,问题可能出在这
算法·程序员
AskHarries7 小时前
如何拿第一批100用户
程序员
高晶9 小时前
Android 文件管理器开发实战指南
程序员·代码规范
挖掘狂人11 小时前
AI 写代码越来越快,我们的代码能力却在悄悄退化
人工智能·程序员·ai编程