🎯 本章你会学到:if / switch / 三种循环,以及 C 里最容易踩的运算符坑。建议边读边敲,每节练习先自己做,再展开答案对照。
流程控制本身不难,难的是运算符细节:整数除法、= 与 ==、短路求值的副作用。这一章把两块一起过。
if 与逻辑运算
判断闰年
#include <stdbool.h>
#include <stdio.h>
static bool is_leap(int y) {
return (y % 4 == 0 && y % 100 != 0) || y % 400 == 0;
}
int main(void) {
int y = 0;
if (scanf("%d", &y) != 1) {
return 1;
}
printf("%d is %s\n", y, is_leap(y) ? "leap" : "common");
return 0;
}输入
2000运行结果
2000 is leap
输入 2000 输出 2000 is leap。&& 和 || 是短路求值:左边已能决定结果时右边不执行。这既省时间,也意味着别把副作用(++、函数调用)塞进条件里。
for 与 while
for 与 while
#include <stdio.h>
int main(void) {
int n = 0;
if (scanf("%d", &n) != 1) {
return 1;
}
long long sum = 0;
for (int i = 1; i <= n; ++i) {
sum += i;
}
printf("sum=%lld\n", sum);
int i = 0;
while (i < 3) {
printf("loop %d\n", i);
++i;
}
return 0;
}输入
100运行结果
sum=5050
loop 0
loop 1
loop 2
输入 100 会先输出 sum=5050,再输出三行 loop 0..2。次数明确用 for,条件明确用 while,至少要执行一次用 do-while。
⚠️ 易错点
if (x = 5) 永远为真:把 == 写成 = 是 C 系语言第一坑。开了 -Wall 编译器会警告,见到就必须改。⚠️ 易错点
switch 的每个 case 末尾要 break,否则会贯穿执行下一个分支;在 case 里定义变量用花括号圈出作用域。✍️ 本节练习
3.1必做奇偶判断
读入一个整数 n,偶数输出 even,奇数输出 odd。
输入 一个整数 n。
输出 even 或 odd。
样例输入
7样例输出
odd💡 提示 n % 2 == 0 判断偶数。
✅ 查看参考答案与解析
#include <stdio.h>
int main(void) {
int n = 0;
if (scanf("%d", &n) != 1) {
return 1;
}
if (n % 2 == 0) {
printf("even\n");
} else {
printf("odd\n");
}
return 0;
}解析 负数同样适用:-7 % 2 得 -1,不等于 0,所以判为奇数。
3.2挑战偶数求和
读入 n,输出 2..n 之间所有偶数的和(n 最大 10^9)。
输入 一个整数 n(1 ≤ n ≤ 10^9)。
输出 一行 sum=结果。
样例输入
10样例输出
sum=30💡 提示 循环步长写 2;也可以直接用等差数列公式。
✅ 查看参考答案与解析
#include <stdio.h>
int main(void) {
long long n = 0;
if (scanf("%lld", &n) != 1) {
return 1;
}
long long k = n / 2; /* 2, 4, ..., 2k */
long long sum = k * (k + 1); /* 等差数列求和 */
printf("sum=%lld\n", sum);
return 0;
}解析 用公式而不是循环:n 到 10^9 时循环要跑 5 亿次,公式一步算完。这是复杂度意识的第一课。