欢迎光临
我们一直在努力

【C语言核心秘籍】分支与循环全解析:从青铜到王者的逻辑进阶之路

一、 引言:从现实世界到代码世界的映射

想象一下:早上起床,你**判断(分支)天气:如果下雨就带伞;如果晴天就戴墨镜。上班路上,你重复(循环)**等待地铁:只要地铁没来,就一直等待。

这就是程序世界的两个核心逻辑在我们日常生活中的体现。C语言提供了三种基本结构:顺序、选择、循环。今天,我们就聚焦于选择(分支)和循环这两大“神器”,它们是让程序“有思想”和“不知疲倦”的关键。

二、 分支语句(选择结构)——程序的“选择题”

1. if语句:最直观的条件判断

语法结构:if (条件表达式) { 执行语句; }

if (下雨) {
带伞();
}

1.1 基础if-else:非此即彼

#include <stdio.h>
int main() {
int age;
printf("请输入你的年龄:");
scanf("%d", &age);

if (age >= 18) {
printf("成年人\\n");
} else {
printf("未成年人\\n");
}
return 0;
}

1.2 多重逻辑判断:if-else if-else

#include <stdio.h>
int main() {
int score;
printf("请输入成绩:");
scanf("%d", &score);

if (score >= 90) {
printf("优秀\\n");
} else if (score >= 70) {
printf("良好\\n");
} else if (score >= 60) {
printf("及格\\n");
} else {
printf("不及格\\n");
}
return 0;
}

1.3 嵌套if:俄罗斯套娃式判断

#include <stdio.h>
int main() {
int num;
printf("请输入一个整数:");
scanf("%d", &num);

if (num != 0) {
if (num > 0) {
printf("正数\\n");
} else {
printf("负数\\n");
}
} else {
printf("零\\n");
}
return 0;
}

1.4 新手必踩的坑:悬空else问题

#include <stdio.h>
int main() {
int a = 0;
int b = 2;
if (a == 1)
if (b == 2)
printf("hehe\\n");
else // 这个else跟最近的if匹配,而不是第一个!
printf("haha\\n");
// 实际输出:什么都没有!
return 0;
}

重要规则:else总是与**最近的未匹配if**配对!

2. switch语句:多路分支的“快捷通道”

当判断条件是基于单个整型表达式的多个离散值时,switch比一连串if-else更优雅。

语法结构:

switch (表达式) {
case 常量1: 语句1; break;
case 常量2: 语句2; break;
default: 默认语句;
}

2.1 基础示例:星期判断

#include <stdio.h>
int main() {
int day;
printf("请输入星期几(1-7):");
scanf("%d", &day);

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");
}
return 0;
}

2.2 break的重要性:防止“穿透”

#include <stdio.h>
int main() {
int num = 2;
switch (num) {
case 1: printf("一");
case 2: printf("二"); // 会继续执行后面的case!
case 3: printf("三");
default: printf("其他");
}
// 输出:"二三其他" 而不是 "二"
return 0;
}

关键点:没有break,程序会穿透执行后续所有case!

2.3 巧妙使用穿透特性

#include <stdio.h>
int main() {
int month;
printf("请输入月份:");
scanf("%d", &month);

switch (month) {
case 12:
case 1:
case 2:
printf("冬季\\n"); break; // 三个case共享一个逻辑
case 3:
case 4:
case 5:
printf("春季\\n"); break;
// … 其他季节类似
default: printf("月份错误\\n");
}
return 0;
}

3. 关系操作符与逻辑操作符

3.1 关系操作符:比较大小

int a = 10, b = 20;
a > b; // 大于,假(0)
a < b; // 小于,真(非0)
a >= b; // 大于等于
a <= b; // 小于等于
a == b; // 等于(注意是两个等号!)
a != b; // 不等于

易错点:=是赋值,==才是比较!

3.2 逻辑操作符:组合条件

int age = 25, score = 85;

// 逻辑与&&:两个条件都满足才为真
if (age >= 18 && score >= 60) {
printf("成年人且及格\\n");
}

// 逻辑或||:至少一个满足就为真
if (age < 18 || age >= 60) {
printf("未成年人或老年人\\n");
}

// 逻辑非!:取反
if (!(score < 60)) {
printf("没有不及格\\n");
}

3.3 短路求值:提高效率

int a = 0, b = 10;
if (a != 0 && b / a > 2) {
// 由于a!=0为假,&&直接短路,不会执行b/a,避免了除零错误!
}

if (a == 0 || b / a > 2) {
// 由于a==0为真,||直接短路,同样安全
}

三、 循环语句——程序的"永动机"

1. while循环:当…的时候

语法:while (条件表达式) { 循环体; }

#include <stdio.h>
int main() {
int i = 1;
while (i <= 10) {
printf("%d ", i);
i++; // 千万别忘了改变循环条件!
}
// 输出:1 2 3 4 5 6 7 8 9 10
return 0;
}

1.1 实例:逆转数字

#include <stdio.h>
int main() {
int num = 1234;
while (num != 0) {
printf("%d", num % 10); // 获取最低位
num /= 10; // 去掉最低位
}
// 输出:4321
return 0;
}

2. for循环:最精炼的循环

语法:for (初始化; 条件; 调整) { 循环体; }

#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
printf("%d ", i);
}
// 输出:1 2 3 4 5 6 7 8 9 10
return 0;
}

2.1 计算1-100中3的倍数之和

#include <stdio.h>
int main() {
int sum = 0;
for (int i = 1; i <= 100; i++) {
if (i % 3 == 0) {
sum += i;
}
}
printf("3的倍数之和为:%d\\n", sum); // 输出:1683
return 0;
}

2.2 for循环的灵活性

// 省略部分表达式的for循环
int i = 0;
for (; i < 10; ) { // 可以省略初始化和调整
printf("%d ", i);
i++;
}

// 死循环
for (;;) {
printf("无限循环\\n");
}

3. do-while循环:先斩后奏

语法:do { 循环体; } while (条件);

#include <stdio.h>
int main() {
int i = 1;
do {
printf("%d ", i);
i++;
} while (i <= 10);
// 输出:1 2 3 4 5 6 7 8 9 10
return 0;
}

3.1 do-while的特点:至少执行一次

#include <stdio.h>
int main() {
int password = 0;
do {
printf("请输入密码:");
scanf("%d", &password);
} while (password != 123456); // 密码错误就继续输入
printf("登录成功!\\n");
return 0;
}

四、 循环控制:break与continue

1. break:立即终止循环

#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
break; // 当i等于5时,直接跳出整个循环
}
printf("%d ", i);
}
// 输出:1 2 3 4
return 0;
}

2. continue:跳过本次循环

#include <stdio.h>
int main() {
for (int i = 1; i <= 10; i++) {
if (i == 5) {
continue; // 跳过i=5这次循环,进入下一轮
}
printf("%d ", i);
}
// 输出:1 2 3 4 6 7 8 9 10
return 0;
}

2.1 while和for中continue的区别

// while中使用continue可能造成死循环
int i = 0;
while (i < 10) {
i++;
if (i == 5) {
continue; // 跳到判断条件
}
printf("%d ", i);
}

// for中使用continue跳到调整部分
for (int i = 0; i < 10; i++) {
if (i == 5) {
continue; // 跳到i++
}
printf("%d ", i);
}

五、 循环嵌套:算法的力量

1. 打印九九乘法表

#include <stdio.h>
int main() {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
printf("%d*%d=%-2d ", j, i, i * j);
}
printf("\\n");
}
return 0;
}

2. 找出100-200之间的素数

#include <stdio.h>
int main() {
for (int i = 100; i <= 200; i++) {
int flag = 1; // 假设是素数
for (int j = 2; j * j <= i; j++) {
if (i % j == 0) {
flag = 0; // 不是素数
break;
}
}
if (flag == 1) {
printf("%d ", i);
}
}
return 0;
}

六、 实战演练:猜数字游戏

// 猜数字游戏
srand(time(NULL));// 随机数种子
int min = 1, max = 100;
int random_num = rand() % (max – min + 1) + min;// 生成min到max之间的数
int choice = NULL;// 用户选择
int num = 0;// 用户猜测的数
game:
printf("请选择(0退出/1开始):");
scanf("%d", &choice);
if (choice == 1)
{
int count_guess = 0;
int last_time = 20;
while (choice == 1) {
if (last_time > 0)
{
printf("请猜测数字:");
scanf("%d", &num);
if (num < random_num)
{
printf("小了!\\n");
count_guess++;
last_time–;
}
else if (num > random_num)
{
printf("大了!\\n");
count_guess++;
last_time–;
}
else
{
printf("恭喜,猜对了!\\n");
count_guess++;
printf("猜了%d次\\n", count_guess);
last_time–;
goto game;// 重新让用户选择是否继续
}
}
else
{
printf("次数耗尽,重新开始!\\n");
goto game;
}
}
}
else if (choice == 0)
{
printf("程序退出。\\n");
}
else
{
printf("输入有误,请重新输入!\\n");
goto game;
}

七、 总结与进阶建议

分支与循环的核心要点总结:

结构类型关键字适用场景特点
分支 if 条件判断灵活 可处理复杂逻辑
分支 switch 离散值判断 代码更清晰,效率高
循环 while 不确定循环次数 先判断后执行
循环 for 确定循环次数 将初始化、判断、调整集中管理
循环 do-while 至少执行一次 先执行后判断

给初学者的进阶建议:

  • 从模仿开始:将本文中的所有例子在IDE中亲手敲一遍,理解内存和输出的变化

  • 善用调试:在VS2022中设置断点,观察循环变量如何一步步变化

  • 挑战项目:

    • 升级猜数字游戏:增加难度选择、猜数字范围、猜中排名
    • 制作简易计算器:使用switch实现加减乘除
    • 数字金字塔:使用嵌套循环打印各种图案
  • 避免常见错误:

    • 循环忘记改变条件变量 → 造成死循环
    • if判断中使用=而非==
    • switch中忘记写break
    • 复杂的if嵌套缺少大括号
  • 学习路线规划:

    今天掌握的分支和循环是程序的逻辑骨架。接下来你应该:

  • 函数:将重复的代码封装起来,让程序模块化
  • 数组:处理批量数据,结合循环威力倍增
  • 指针:理解内存本质,开启C语言高级篇章
  • 结构体:创建自定义数据类型,描述复杂对象
  • 赞(0)
    未经允许不得转载:171主机测评 » 【C语言核心秘籍】分支与循环全解析:从青铜到王者的逻辑进阶之路
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址