一、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,而非 0。
-
break vs continue :
break跳出整个循环,continue跳过本次剩余语句。 -
数据类型选择 :大数运算使用
long long,字符参与算术运算时会自动提升为int。 -
sizeof 是运算符:不是函数,常用于确定数组长度或跨平台兼容性。
六、练习与扩展
尝试自己完成以下任务,巩固所学知识:
-
用
while循环输出 100 以内所有 7 的倍数。 -
输入一个正整数 n,计算 1² + 2² + ... + n² 的值。
-
打印 9×9 乘法表(使用嵌套循环)。
-
用
sizeof验证不同平台上各类型的字节数差异。
掌握好
while循环与基本数据类型,是学习 C 语言后续内容(数组、函数、指针)的重要基石。加油!