C语言核心:分支与循环

C语言是一种结构化的程序设计语言。所谓“结构”,指的是代码执行的三种基本方式:

  1. 顺序结构 (Sequential Structure):代码从上到下一行一行地执行,这是最基本的流程。

  2. 选择结构 (Selection Structure):也称为分支结构,程序根据特定条件的真假,选择性地执行某一段代码。

  3. 循环结构 (Loop Structure):程序在满足特定条件的情况下,重复执行某一段代码。

我们日常生活中的所有事情,几乎都可以拆解成这三种结构的组合。学会它们,你就掌握了赋予程序“智慧”和“效率”的钥匙。


1. if语句

if 语句是实现选择结构的基础,它让程序能够根据条件做出判断。

1.1 基本 if

if 的语法非常直观:

if (表达式)
    语句;

如果表达式结果为「真」,就执行后面的语句;如果为「假」,则跳过。

        C语言中的真与假:C语言中,0代表「假」(False),任何非0的值都代表「真」(True)。

范例:判断一个数是否为奇数

#include <stdio.h>

int main()
{
    int num = 0;
    printf("请输入一个整数: ");
    scanf("%d", &num);

    // 如果 num 除以 2 的余数为 1,条件为真
    if (num % 2 == 1)
        printf("%d 是奇数\n", num);

    return 0;
}

1.2 if...else 结构

如果一个数不是奇数,那它就是偶数。这种“二选一”的情境,我们可以使用 if...else

if (表达式)
    语句1;
else
    语句2;

范例:判断奇偶数

#include <stdio.h>

int main()
{
    int num = 0;
    printf("请输入一个整数: ");
    scanf("%d", &num);

    if (num % 2 == 1)
        printf("%d 是奇数\n", num);
    else
        printf("%d 是偶数\n", num);

    return 0;
}

1.3 控制多条语句

ifelse 默认只控制其后的一条语句。如果你希望在条件成立时执行多个操作,必须使用大括号 {} 将这些语句包裹起来,形成一个“代码区块”。

#include <stdio.h>

int main()
{
    int age = 0;
    printf("请输入您的年龄: ");
    scanf("%d", &age);

    if (age >= 18)
    {
        printf("您已成年\n");
        printf("可以为自己的行为负责了\n");
    }
    else
    {
        printf("您还未成年\n");
        printf("要好好学习哦\n");
    }
    return 0;
}

1.4 嵌套 if 与多重判断

if 语句可以嵌套,形成更复杂的判断逻辑。else if 是其中最常见的形式,用于处理多种可能的情况。

范例:判断数字是正数、负数还是零

#include <stdio.h>

int main()
{
    int num = 0;
    scanf("%d", &num);

    if (num > 0)
    {
        printf("输入的数字是正数\n");
    }
    else if (num < 0) // 这个 if 嵌套在前一个 else 中
    {
        printf("输入的数字是负数\n");
    }
    else
    {
        printf("输入的数字是0\n");
    }

    return 0;
}

1.5 悬空 else 问题

ifelse 嵌套时,记住一个原则:else 永远与离它最近、尚未配对的 if 匹配。

看看下面的例子:

int a = 0;
int b = 2;
if (a == 1)
    if (b == 2)
        printf("hehe\n");
else
    printf("haha\n");

这段代码什么都不会输出。因为 else 会和 if(b == 2) 配对。由于 a == 1 为假,内部的 if-else 结构根本不会被执行。

为了避免混淆,强烈建议始终使用 {} 来明确代码的逻辑归属,即使区块内只有一行代码。


2. 关系与逻辑运算符

2.1 关系运算符

关系运算符用于比较,其结果为 1 (真) 或 0 (假)。

运算符意义
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于

注意== 是“等于”的比较,而 = 是“赋值”。初学者极易混淆!

if (x = 3) // 错误!这会将 3 赋值给 x,表达式结果为 3 (真)
if (x == 3) // 正确!这会判断 x 的值是否为 3

个小技巧是将常数写在左边 if (3 == x),如果误写成 if (3 = x),编译器会直接报错。

2.2 逻辑运算符

逻辑运算符用于组合多个条件。

运算符意义说明
&&逻辑 AND(A && B) 只有 A 和 B 都为真时才为真
``
!逻辑 NOT(!A) 如果 A 为假,则结果为真

范例:判断闰年 闰年的规则是:能被4整除但不能被100整除,或者能被400整除。

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

短路求值 (Short-circuiting)

&&|| 有一个“短路”特性:

  • 对于 A && B,如果 A 已经为假,那么整个表达式必定为假,B 将不会被计算。

  • 对于 A || B,如果 A 已经为真,那么整个表达式必定为真,B 将不会被计算。


3. switch 语句

当你的判断条件是基于一个变量的多个特定整数值时,switch 是比一长串 else if 更清晰的选择。

switch (整型表达式)
{
    case 常量值1:
        // 代码...
        break;
    case 常量值2:
        // 代码...
        break;
    // ...
    default:
        // 如果以上 case 都不匹配,则执行这里...
        break;
}

关键点:

  1. breakbreak 的作用是跳出整个 switch 结构。如果省略 break,程序会继续执行下一个 case 的代码,直到遇到 breakswitch 结束。这有时可用于合并处理多个 case

  2. default:处理所有未匹配到的情况,类似 if...else 中的 else

范例:判断工作日与休息日

#include <stdio.h>

int main()
{
    int day = 0;
    printf("请输入星期 (1-7): ");
    scanf("%d", &day);

    switch(day)
    {
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
            printf("工作日\n");
            break;
        case 6:
        case 7:
            printf("休息日\n");
            break;
        default:
            printf("输入错误\n");
            break;
    }

    return 0;
}

4. 循环语句

循环让程序能高效地处理重复性任务。

4.1 while 循环

while 循环是“先判断,后执行”。

while (表达式)
{
    // 循环体语句
}

只要 表达式 为真,循环就会一直执行。

范例:打印 1 到 10

#include <stdio.h>

int main()
{
    int i = 1;
    while (i <= 10)
    {
        printf("%d ", i);
        i = i + 1; // 更新循环变量,避免死循环
    }
    printf("\n");
    return 0;
}

4.2 for 循环

for 循环是使用最广泛的循环结构,它将“初始化、条件判断、调整”三部分集中在一起,结构清晰。

for (表达式1; 表达式2; 表达式3)
{
    // 循环体语句
}
  • 表达式1: 初始化。只在循环开始前执行一次。

  • 表达式2: 条件判断。每次循环开始前执行。

  • 表达式3: 调整。每次循环体执行完毕后执行。

范例:打印 1 到 10

#include <stdio.h>

int main()
{
    int i = 0;
    for (i = 1; i <= 10; i++)
    {
        printf("%d ", i);
    }
    printf("\n");
    return 0;
}

4.3 do...while 循环

do...while 循环是“先执行,后判断”,这保证了循环体至少会被执行一次

do
{
    // 循环体语句
} while (表达式);

范例:计算一个正整数是几位数 即使输入的数字是 0,它也是 1 位数,这种情况很适合用 do...while

#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int cnt = 0;

    do
    {
        cnt++;
        n = n / 10;
    } while (n > 0);

    printf("%d\n", cnt);
    return 0;
}

4.4 breakcontinue

  • break:用于永久终止并跳出整个循环。

  • continue:用于跳过本次循环中 continue 后面的代码,直接进入下一次循环的条件判断。

范例:for 循环中的 continue 打印 1 到 10,但跳过 5。

#include <stdio.h>

int main()
{
    for (int i = 1; i <= 10; i++)
    {
        if (i == 5)
        {
            continue; // i 等于 5 时,不执行 printf,直接开始下一次循环
        }
        printf("%d ", i);
    }
    // 输出: 1 2 3 4 6 7 8 9 10
    return 0;
}

5. 实战演练:猜数字游戏

让我们用今天学到的知识,打造一个经典的猜数字游戏。

游戏规则

  1. 电脑自动生成一个 1 到 100 之间的随机数。

  2. 玩家输入猜测的数字。

  3. 电脑给出“猜大了”或“猜小了”的提示。

  4. 直到玩家猜对为止,游戏结束。

5.1 如何生成随机数?

我们需要三个函数:

  • rand():生成一个伪随机数。

  • srand():初始化随机数生成器(设定“种子”)。

  • time():获取当前时间,作为一个不断变化的种子。

#include <stdlib.h> // 包含 rand() 和 srand()
#include <time.h>   // 包含 time()

// 在 main 函数开始时,设置一次随机数种子
srand((unsigned int)time(NULL));

// 生成 1 到 100 的随机数
int secret_number = rand() % 100 + 1;

5.2 完整游戏代码

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void game()
{
    // 1. 生成随机数
    int r = rand() % 100 + 1;
    int guess = 0;
    int count = 5; // 限制猜测次数

    printf("\n--- 游戏开始,你有 %d 次机会 ---\n", count);

    // 2. 循环猜数字
    while (count > 0)
    {
        printf("\n你还有 %d 次机会\n", count);
        printf("请猜数字 (1-100) >: ");
        scanf("%d", &guess);

        if (guess < r)
        {
            printf("猜小了\n");
        }
        else if (guess > r)
        {
            printf("猜大了\n");
        }
        else
        {
            printf("恭喜你,猜对了!\n");
            return; // 猜对了就结束函数
        }
        count--;
    }

    printf("很遗憾,你的机会用完了。正确答案是:%d\n", r);
}

void menu()
{
    printf("*******************\n");
    printf("***** 1. play *****\n");
    printf("***** 0. exit *****\n");
    printf("*******************\n");
}

int main()
{
    int input = 0;
    // 设置随机数种子
    srand((unsigned int)time(NULL));

    do
    {
        menu();
        printf("请选择:>");
        scanf("%d", &input);
        switch(input)
        {
            case 1:
                game();
                break;
            case 0:
                printf("游戏结束\n");
                break;
            default:
                printf("选择错误,请重新选择\n");
                break;
        }
    } while (input);

    return 0;
}

总结

今天,我们学习了C语言的流程控制,从 if 的条件判断到 switch 的多路选择,再到 while, for, do...while 的循环执行。这些是构建任何复杂程序的基础。

希望通过这篇文章和最后的猜数字游戏,你能对分支与循环有更深刻的理解。现在,动手去写一些代码,用这些结构解决你遇到的小问题吧!编程的乐趣,就在于此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值