C 语言学习笔记(三):分支与循环

前两篇我们打好了数据类型、变量和操作符的基础,这一篇终于要进入流程控制的世界了 —— 分支和循环是让程序拥有 “判断” 和 “重复执行” 能力的核心,也是我刚开始写逻辑题时最容易踩坑的地方,今天就把这些知识彻底梳理清楚。

一、if 语句

if 语句是最基础的分支结构,用来让程序根据条件选择不同的执行路径。

1. 基本语法

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

示例:判断一个数是否为正数

int num = 10;
if (num > 0) 
{
    printf("这是一个正数\n");
}

2. if-else 结构

当条件不满足时,执行另一段代码:

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

示例:判断奇偶

int num = 7;
if (num % 2 == 0) 
{
    printf("偶数\n");
} 
else 
{
    printf("奇数\n");
}

3. 多分支 if-else if

处理多个条件的情况:

if (条件1) 
{
    // 条件1为真
} 
else if (条件2) 
{
    // 条件2为真
} 
else 
{
    // 所有条件都为假
}

示例:判断成绩等级

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

踩坑提醒:if 后面的条件必须用括号包裹,且不要加分号(否则会变成空语句,逻辑直接出错)。


二、关系操作符

关系操作符用来比较两个值的大小关系,结果是真(非 0)或假(0)

操作符含义示例
==等于a == 5
!=不等于a != 0
>大于a > b
<小于a < b
>=大于等于a >= 10
<=小于等于a <= 20

易错点:= 是赋值,== 才是判断相等,千万不要写错!比如 if (a = 5) 会把 a 赋值为 5,结果永远为真。


三、条件操作符(三目运算符)

条件操作符是 if-else 的简写形式,语法简洁:

条件 ? 表达式1 : 表达式2;
  • 条件为真 → 执行表达式 1
  • 条件为假 → 执行表达式 2

示例:求两个数的最大值

int a = 10, b = 20;
int max = (a > b) ? a : b; // max = 20

适用场景:简单的二选一逻辑,复杂逻辑还是用 if-else 更清晰。


四、逻辑操作符:&&||!

逻辑操作符用来组合多个条件:

操作符含义示例
&&逻辑与条件 1 && 条件 2
||逻辑或条件1 || 条件2
!逻辑非! 条件

规则:

  • &&:两边都为真,结果才为真;只要有一个假,结果就为假
  • ||:只要有一个真,结果就为真;两边都假,结果才为假
  • !:真变假,假变真

示例:判断是否为闰年

int year = 2024;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) 
{
    printf("闰年\n");
} 
else 
{
    printf("平年\n");
}

重点:短路求值

  • &&:左边为假时,右边不会执行
  • ||:左边为真时,右边不会执行这可以用来优化代码,避免不必要的计算。

五、switch 语句

switch 是另一种分支结构,适合处理多值判断的场景,比多分支 if-else if 更清晰。

基本语法

switch (表达式) 
{
    case 常量1:
        // 语句
        break;
    case 常量2:
        // 语句
        break;
    default:
        // 所有case都不匹配时执行
        break;
}

示例:根据数字输出星期几

int day = 3;
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;
    case 6: printf("周六\n"); break;
    case 7: printf("周日\n"); break;
    default: printf("输入错误\n"); break;
}

注意事项:

  1. switch 后的表达式只能是整型或字符型
  2. 每个 case 后必须加 break,否则会 “贯穿” 到下一个 case
  3. default 不是必须的,但建议加上,处理异常情况

六、while 循环

while 循环是最基础的循环结构,用来重复执行一段代码,直到条件不满足。

语法

while (条件表达式) 
{
    // 循环体
}
  • 先判断条件,条件为真才执行循环体
  • 循环体执行完后,再次判断条件

示例:计算 1 到 10 的和

int i = 1, sum = 0;
while (i <= 10) 
{
    sum += i;
    i++; // 必须更新循环变量,否则会死循环
}
printf("sum = %d\n", sum); // 输出55

死循环:如果忘记更新循环变量(比如 i++),条件永远为真,程序会一直跑下去。


七、for 循环

for 循环是最常用的循环,把初始化、条件、更新写在一起,结构更紧凑。

语法

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

执行顺序:

  1. 初始化 → 2. 判断条件 → 3. 执行循环体 → 4. 更新 → 回到 2

示例:打印 1 到 10

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

技巧:for 循环的三个部分都可以省略,但分号不能丢,比如 for(;;) 就是一个死循环。


八、do-while 循环

do-while 循环和 while 类似,但先执行循环体,再判断条件,所以循环体至少会执行一次。

语法

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

示例:猜数字游戏(至少猜一次)

int num = 5, guess;
do 
{
    printf("猜一个1-10的数字:");
    scanf("%d", &guess);
} 
while (guess != num);
printf("恭喜你猜对了!\n");

适用场景:需要先执行一次再判断的场景,比如菜单选择、输入验证。


九、break 和 continue 语句

这两个语句用来控制循环的执行流程:

1. break

  • 作用:跳出当前循环或 switch,结束整个循环
  • 示例:找到 10 以内第一个能被 3 整除的数
int i;
for (i = 1; i <= 10; i++) 
{
    if (i % 3 == 0) 
    {
        printf("找到:%d\n", i); // 输出3
        break; // 跳出for循环
    }
}

2. continue

  • 作用:跳过本次循环剩余部分,直接进入下一次循环判断
  • 示例:打印 1 到 10 中所有奇数
int i;
for (i = 1; i <= 10; i++) 
{
    if (i % 2 == 0) 
    {
        continue; // 跳过偶数,直接下一次循环
    }
    printf("%d ", i); // 输出1 3 5 7 9
}

区别:break 是结束整个循环,continue 是结束本次循环。


十、循环的嵌套

循环里面再套循环,就是嵌套循环,最常见的是二维遍历(比如打印九九乘法表)。

示例:打印九九乘法表

int i, j;
for (i = 1; i <= 9; i++) 
{      // 外层循环:行
    for (j = 1; j <= i; j++) 
    {  // 内层循环:列
        printf("%d*%d=%d\t", j, i, i*j);
    }
    printf("\n"); // 每行结束换行
}

理解:外层循环控制 “大步骤”,内层循环控制 “小步骤”,比如外层控制行,内层控制列。


十一、goto 语句

goto 是无条件跳转语句,可以跳转到函数内任意标记的位置。

语法

goto 标签;
// ...
标签:
    // 语句

示例:跳出多层循环

int i, j;
for (i = 0; i < 10; i++) 
{
    for (j = 0; j < 10; j++) 
    {
        if (i * j == 25) 
        {
            printf("找到i=%d, j=%d\n", i, j);
            goto end; // 直接跳转到end标签
        }
    }
}
end:
    printf("程序结束\n");

注意:goto 会破坏代码结构,不推荐滥用,只在极少数场景(比如跳出多层循环)使用。


总结

这一篇我们系统学习了 C 语言的分支和循环:

  • 分支:ifswitch 让程序会 “做选择”
  • 循环:whilefordo-while 让程序会 “重复做事”
  • 控制:breakcontinuegoto 精细调整执行流程

回想我刚开始学的时候,总是搞不清 for while 的区别,也经常在嵌套循环里绕晕。直到自己写了很多练习题(比如打印金字塔、九九乘法表),才慢慢把这些逻辑吃透。

下一篇我们会学习数组,终于可以处理一组数据了,一起加油!


我的学习感悟

这一章是编程逻辑的核心,光看笔记没用,一定要多写练习题。我当时把「判断闰年」「打印九九乘法表」「猜数字游戏」这些经典题目都敲了一遍,才真正理解了循环和分支的本质。写代码才是最好的老师,这句话真的没错。

持续更新 C 语言学习笔记,欢迎关注点赞收藏~输出才是最好的学习方式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值