C语言是一种结构化的程序设计语言。所谓“结构”,指的是代码执行的三种基本方式:
-
顺序结构 (Sequential Structure):代码从上到下一行一行地执行,这是最基本的流程。
-
选择结构 (Selection Structure):也称为分支结构,程序根据特定条件的真假,选择性地执行某一段代码。
-
循环结构 (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 控制多条语句
if 和 else 默认只控制其后的一条语句。如果你希望在条件成立时执行多个操作,必须使用大括号 {} 将这些语句包裹起来,形成一个“代码区块”。
#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 问题
当 if 和 else 嵌套时,记住一个原则: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;
}
关键点:
-
break:break的作用是跳出整个switch结构。如果省略break,程序会继续执行下一个case的代码,直到遇到break或switch结束。这有时可用于合并处理多个case。 -
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 break 和 continue
-
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 到 100 之间的随机数。
-
玩家输入猜测的数字。
-
电脑给出“猜大了”或“猜小了”的提示。
-
直到玩家猜对为止,游戏结束。
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 的循环执行。这些是构建任何复杂程序的基础。
希望通过这篇文章和最后的猜数字游戏,你能对分支与循环有更深刻的理解。现在,动手去写一些代码,用这些结构解决你遇到的小问题吧!编程的乐趣,就在于此。

789

被折叠的 条评论
为什么被折叠?



