C语言流程控制与函数
大约 2 分钟
C 语言流程控制与函数
配套Demo:codes/02_流程与函数.c
分支结构
if - else
int score = 85;
if (score >= 90) {
printf("优秀\n");
} else if (score >= 60) {
printf("及格\n");
} else {
printf("不及格\n");
}
switch
switch (grade) {
case 'A':
printf("90-100\n");
break; // 不写 break 会继续执行下一个 case(穿透特性)
case 'B':
printf("80-89\n");
break;
default:
printf("其他\n");
}
switch 的判断表达式只能是整型或字符型,case 后必须是常量表达式。
循环结构
// while:先判断后执行
int i = 0;
while (i < 5) {
printf("%d ", i);
i++;
}
// do-while:先执行后判断,循环体至少执行一次
int j = 10;
do {
printf("%d ", j);
j--;
} while (j > 8);
// for:常规计数循环
for (int k = 0; k < 5; k++) {
if (k == 2) continue; // 跳过本次循环
if (k == 4) break; // 结束整个循环
printf("%d ", k);
}
goto
goto end;
printf("这行不会执行\n");
end:
printf("跳转到这里\n");
goto 会破坏结构化流程,仅建议用于多层嵌套循环的一次性跳出。
函数
定义与调用
// 返回类型 函数名(参数列表)
int max(int a, int b)
{
return a > b ? a : b;
}
// 无返回值用 void;无参数建议写 void
void printLine(void)
{
printf("----------\n");
}
int main()
{
printf("%d\n", max(3, 5)); // 5
printLine();
return 0;
}
函数声明(原型)
函数必须先声明后使用,或者把定义写在调用之前:
int max(int a, int b); // 声明,告诉编译器函数长什么样
int main()
{
printf("%d\n", max(3, 5));
return 0;
}
int max(int a, int b) // 定义
{
return a > b ? a : b;
}
值传递
C 语言的函数参数是值传递(拷贝一份传入),函数内修改形参不影响实参:
void change(int x)
{
x = 100; // 只修改了副本
}
int main()
{
int a = 1;
change(a);
printf("%d\n", a); // 仍然是 1
return 0;
}
想在函数内修改外部变量,需要传指针:void change(int *x) { *x = 100; },调用时 change(&a);
递归
// 阶乘:n! = n × (n-1)!
long factorial(int n)
{
if (n <= 1) return 1; // 递归出口,必须有
return n * factorial(n - 1); // 递归调用
}
// factorial(5) = 5×4×3×2×1 = 120
变量作用域与生命周期
| 类别 | 声明位置 | 作用域 | 生命周期 |
|---|---|---|---|
| 局部变量 | 函数/语句块内部 | 所在代码块 | 函数调用期间 |
| 全局变量 | 所有函数外部 | 整个源文件 | 程序整个运行期 |
| static 局部 | 函数内部加 static | 所在函数 | 程序整个运行期 |
| static 全局 | 函数外部加 static | 仅本文件可见 | 程序整个运行期 |
void count()
{
static int times = 0; // 只初始化一次,之后保持上次的值
times++;
printf("第 %d 次调用\n", times);
}
Loading...
