C语言零基础入门:循环控制与数据类型详解

一、while循环基础

1.1 基本语法与执行流程

while 循环是 C 语言中最基本的循环结构之一。它的执行流程是:先判断条件表达式,若为真则执行循环体,然后再次判断条件;若为假则退出循环。

cs 复制代码
while (条件表达式) {
    // 循环体语句
}

关键点:

  • 循环体可能一次都不执行(条件初始为假)。

  • 必须在循环体内改变循环变量的值,否则可能导致死循环。

1.2 实例:打印1~5

下面的代码演示了最简单的 while 循环,依次输出 1 到 5。

cs 复制代码
#include<stdio.h>
int main()
{
    int i;
    i = 1;
    while (i <= 5)          // 循环条件:i <= 5
    {
        printf("%d \n", i); // 先打印,再自增 → 输出 1 2 3 4 5
        i = i + 1;          // 循环控制变量更新
    }
    return 0;
}

运行结果:

1

2

3

4

5

注意 :如果将 i = i + 1; 移到 printf 前面,则会先自增再打印,输出变为 2 3 4 5 6。

1.3 实例:累加求和 1+2+...+10

利用循环实现累加,这是初学编程的经典题目。

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 1;
    int sum = 0;
    while (i <= 10)
    {
        sum = sum + i;   // 每次将 i 累加到 sum
        i = i + 1;
    }
    printf("总和是:%d\n", sum);   // 输出 55
    return 0;
}

原理 :sum 初始为 0,每轮加上当前的 i,最后得到 1+2+...+10 = 55。

1.4 实例:累乘求阶乘 n!

计算 n!(n 的阶乘),即 1×2×3×...×n。

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 1;
    int n = 0;
    printf("请输入一个数:");
    scanf("%d", &n);
    int sum = 1;               // 注意累乘初始值为 1
    while (i <= n)
    {
        sum = sum * i;         // 累乘
        i = i + 1;
    }
    printf("%d \n", sum);      // 输出结果
    return 0;
}

易错提醒 :累乘变量必须初始化为 1,而不是 0(否则结果永远为 0)。

1.5 实例:打印阶乘计算过程

有时我们需要看到每一步的计算步骤,可以在循环中输出中间结果。

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 1;
    int n = 0;
    printf("请输入一个数:");
    scanf("%d", &n);
    int sum = 1;
    while (i < n)              // 循环到 n-1,最后一项单独处理
    {
        printf("%d * ", i);    // 打印乘式前半部分
        sum = sum * i;
        i = i + 1;
    }
    printf("%d = ", n);        // 打印最后一个因子
    sum = sum * n;
    printf("%d \n", sum);      // 打印结果
    return 0;
}

例如输入 5,输出:1 * 2 * 3 * 4 * 5 = 120


二、循环控制:break与continue

2.1 break:跳出整个循环

break 用于立即终止当前所在的整个循环,不再执行后续任何迭代。

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 0;
    while (i < 15)
    {
        i = i + 1;
        if (i == 5)
        {
            break;             // 当 i 等于 5 时跳出循环
        }
        printf("%d\t", i);
    }
    return 0;
}

输出 :1 2 3 4 (遇到 break 后循环结束)

2.2 continue:跳过本次循环

continue 用于跳过当前迭代中剩余的语句,直接进入下一次循环的条件判断。

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 0;
    while (i < 15)
    {
        i = i + 1;
        if (i == 5)
        {
            continue;          // 跳过 i==5 时的打印
        }
        printf("%d\t", i);
    }
    return 0;
}

输出 :1 2 3 4 6 7 8 9 10 11 12 13 14 15(缺少 5)

对比 :break 彻底终止循环,continue 只结束本轮循环。


三、综合练习:打印图案与筛选数字

3.1 打印3列星号矩阵

使用循环配合取模运算,实现每行固定数量的输出。

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 1;
    while (i <= 15)
    {
        printf("*\t");           // 打印一个星号加制表符
        if (i % 3 == 0)          // 每三个换行
        {
            printf("\n");
        }
        i = i + 1;
    }
    return 0;
}

输出效果:

cs 复制代码
*	*	*
*	*	*
*	*	*
*	*	*
*	*	*

3.2 输出前n个奇数

两种常见思路:直接生成奇数序列,或判断奇数并计数。

方法一 :利用等差数列公式 j = 2*i - 1

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 1;
    int j = 1;          // 第一个奇数为1
    int n;
    scanf("%d", &n);
    while (i <= n)
    {
        printf("%d\t", j);
        i = i + 1;
        j = j + 2;      // 每次加2得到下一个奇数
    }
    return 0;
}

方法二:遍历自然数,遇到奇数就输出并计数,直到达到 n 个。

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 1;
    int j = 0;          // 计数器
    int n;
    scanf("%d", &n);
    while (1)           // 无限循环,靠内部 break 退出
    {
        if (i % 2 == 1) // 判断是否为奇数
        {
            printf("%d\t", i);
            j = j + 1;
            if (j == n)
            {
                break;  // 已输出 n 个,退出
            }
        }
        i = i + 1;
    }
    return 0;
}

3.3 输出不能被2、3、5整除的数

利用条件判断过滤数字,可以使用 if-else 或 continue 实现。

方式一 :if-else 结构

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 1;
    int n;
    scanf("%d", &n);
    while (i <= n)
    {
        if (i % 2 == 0 || i % 3 == 0 || i % 5 == 0)
        {
            // 什么都不做,跳过
        }
        else
        {
            printf("%d ", i);
        }
        i = i + 1;
    }
    return 0;
}

方式二 :使用 continue 简化逻辑

cs 复制代码
#include<stdio.h>
int main()
{
    int i = 0;
    int n;
    scanf("%d", &n);
    while (i < n)
    {
        i = i + 1;
        if (i % 2 == 0 || i % 3 == 0 || i % 5 == 0)
        {
            continue;       // 满足任一条件则跳过打印
        }
        printf("%d ", i);
    }
    return 0;
}

推荐:第二种写法更清晰,避免空分支。


四、数据类型与sizeof运算符

4.1 整型与字符型混合运算

C 语言中,char 本质上是小范围的整数类型(通常占1字节),可以与 int 直接进行算术运算,结果自动提升为 int。

cs 复制代码
#include<stdio.h>
int main()
{
    int a = 3;
    char b = 'A';           // 'A' 的 ASCII 码为 65
    int m = a + b;          // 3 + 65 = 68
    printf("%d   %c", m, m); // 输出:68   D
    return 0;
}

解释 :m 的值是 68,对应 ASCII 字符 'D',所以 %c 输出 D。

4.2 长整型与大数运算

当数值超出 int 范围时,需要使用 long long 类型,并用 %lld 格式化输出。

cs 复制代码
#include<stdio.h>
int main()
{
    long long int a = 2320002;
    long long int b = 2328388;
    long long int m = a * b;
    printf("%lld", m);      // 输出乘积结果
    return 0;
}

注意 :32位系统下 int 最大约21亿,两个百万级数相乘很容易溢出,务必选用合适的数据类型。

4.3 sizeof用法详解

sizeof 是一个运算符,不是函数,用于获取变量或数据类型所占内存的字节数。它在编译时求值,不需要运行时。

cs 复制代码
#include<stdio.h>
int main()
{
    printf("sizeof(char) = %d字节\n", sizeof(char));
    printf("sizeof(short) = %d字节\n", sizeof(short));
    printf("sizeof(int) = %d字节\n", sizeof(int));
    printf("sizeof(long) = %d字节\n", sizeof(long));
    printf("sizeof(long long) = %d字节\n", sizeof(long long));

    int a;
    printf("sizeof(a) = %d字节\n", sizeof(a));   // 变量也可
    return 0;
}

典型输出(64位系统):

数据类型 字节数
char 1
short 2
int 4
long 8
long long 8

与 strlen 的区别 :strlen 是函数,需要 <string.h>,计算字符串长度时不包含结尾的 \0;而 sizeof 计算数组时包含所有元素(包括 \0)。

五、总结与注意事项

  1. 循环变量更新:务必在循环体内改变循环变量,否则容易死循环。

  2. 累乘初始化:累乘变量应初始化为 1,而非 0。

  3. break vs continue :break 跳出整个循环,continue 跳过本次剩余语句。

  4. 数据类型选择 :大数运算使用 long long,字符参与算术运算时会自动提升为 int。

  5. sizeof 是运算符:不是函数,常用于确定数组长度或跨平台兼容性。


六、练习与扩展

尝试自己完成以下任务,巩固所学知识:

  1. 用 while 循环输出 100 以内所有 7 的倍数。

  2. 输入一个正整数 n,计算 1² + 2² + ... + n² 的值。

  3. 打印 9×9 乘法表(使用嵌套循环)。

  4. 用 sizeof 验证不同平台上各类型的字节数差异。

掌握好 while 循环与基本数据类型,是学习 C 语言后续内容(数组、函数、指针)的重要基石。加油!

相关推荐
Bluetooth73015 分钟前
c语言变量的存储类别
c语言
lhbweilai6 小时前
分析FreeRTOS内核对象API的源码实现(四)
c语言·stm32·单片机
inrichtt9 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
HPtiger9 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训9 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设
DongQiShanRen10 小时前
六根硬件映射(四):归属澄清、两处不一致与卷十一总表
开发语言·人工智能·算法·rust·哈希算法·集成学习
CCblandy10 小时前
雪花 ID 四个边界实测:时钟回拨重号 500 个,前端 JSON.parse 直接丢精度
后端·python·算法·性能优化·架构
丑梨数据10 小时前
信创环境里跑文档工具:格式兼容与本地合规的几个坑
数据结构·人工智能·算法·决策树·排序算法
烂蜻蜓10 小时前
Pandas入门教程(四):Series数据结构——创建、索引与常用方法
数据结构·pandas
erzong23112 小时前
Linux操作系统:线程概念与控制
linux·算法