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-elsecontinue 实现。

方式一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 continuebreak 跳出整个循环,continue 跳过本次剩余语句。

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

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


六、练习与扩展

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

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

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

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

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

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

相关推荐
晚风醉蝶2 小时前
1-6-插入排序-InsertionSort
java·数据结构·排序算法
Tyler_TXZ2 小时前
C++C语言之——二叉树
c语言·开发语言·数据结构·c++·二叉树
Tisfy2 小时前
LeetCode 3090.每个字符最多出现两次的最长子字符串:二重循环 / 滑动窗口
算法·leetcode·字符串·题解·模拟·双指针·滑动窗口
-dzk-2 小时前
【技巧】LC 136.只出现一次的数字
算法·异或
小羊先生car2 小时前
F429-HAL-RS485(回环/双机实验)(2026/8/16)
c语言·单片机·嵌入式硬件·软件构建
有点。3 小时前
C++二叉树二(练习题)
数据结构·c++·算法·图论
专注仿真3 小时前
问答大模型技术方案算法实现-RAPTOR树构建算法与BEG集成使用
python·算法
zlinear数据采集卡4 小时前
数据采集卡从入门到精通(10):采样率与分辨率的核心关系——反比律、架构分布与过采样
arm开发·嵌入式硬件·算法·fpga开发·架构·开源
白狐_7985 小时前
408 数据结构|线索二叉树两题详解:先序线索化后的空链域 + 中序前驱/后继判断
c语言·数据结构·链表