Pwn 基础之C/C++(二):控制流程、函数与作用域
本篇目标:掌握条件、循环和函数,理解参数传递以及局部变量的作用域。
预计阅读时间:15~20 分钟。
1. 条件判断
if (score >= 90) {
printf("A\n");
} else if (score >= 60) {
printf("Pass\n");
} else {
printf("Fail\n");
}
在 C 中:
0 表示假
非 0 表示真
注意:= 是赋值,== 才是比较相等。
2. switch
switch (choice) {
case 1:
printf("Add\n");
break;
case 2:
printf("Show\n");
break;
default:
printf("Unknown\n");
break;
}
break 用于退出 switch。省略后可能继续执行后面的 case,称为 fall-through。
3. 循环
for
for (int i = 0; i < 10; i++) {
printf("%d\n", i);
}
执行顺序:初始化、判断、循环体、更新、重新判断。
while
int i = 0;
while (i < 10) {
printf("%d\n", i);
i++;
}
do-while
int choice;
do {
scanf("%d", &choice);
} while (choice != 0);
do-while 至少执行一次循环体。
break 和 continue
break:结束当前循环;continue:跳过本轮剩余代码,进入下一轮。
4. 定义函数
int add(int a, int b)
{
return a + b;
}
调用:
int result = add(10, 20);
函数由返回类型、函数名、参数列表和函数体组成。
没有返回值时使用 void:
void print_line(void)
{
printf("----------\n");
}
5. 函数声明与定义
如果定义位于调用位置之后,需要先声明:
#include <stdio.h>
int add(int a, int b);
int main(void)
{
printf("%d\n", add(10, 20));
return 0;
}
int add(int a, int b)
{
return a + b;
}
声明告诉编译器函数的类型,定义提供真正的函数体。
6. C 默认按值传递
void change(int value)
{
value = 100;
}
int main(void)
{
int number = 10;
change(number);
printf("%d\n", number);
return 0;
}
输出仍是 10。调用时复制了 number 的值,函数修改的是副本。
后续学习指针后,可以把变量地址传给函数,从而修改原变量。
7. 作用域
int global_value = 100;
void function(void)
{
int local_value = 200;
}
- 全局变量:在文件范围声明,生命周期通常覆盖程序运行期;
- 局部变量:只能在所属代码块内通过该名称访问;
- 参数:作用域位于对应函数内部。
if (1) {
int value = 10;
}
// 此处不能再使用 value
8. static 局部变量
void counter(void)
{
static int count = 0;
count++;
printf("%d\n", count);
}
连续调用三次会输出 1、2、3。它的名称作用域仍在函数内,但对象的生命周期覆盖整个程序运行期。
9. 递归
unsigned long long factorial(unsigned int n)
{
if (n <= 1) {
return 1;
}
return n * factorial(n - 1);
}
递归必须具有能够到达的终止条件。每次调用都有独立的参数和局部运行环境。
10. 一个完整示例
#include <stdio.h>
int is_even(int value)
{
return value % 2 == 0;
}
int main(void)
{
for (int i = 1; i <= 10; i++) {
if (is_even(i)) {
printf("%d is even\n", i);
} else {
printf("%d is odd\n", i);
}
}
return 0;
}
本篇练习
- 判断一个数是否为正数、负数或零。
- 使用循环计算
1~n的和。 - 编写函数判断质数。
- 分别使用循环和递归计算阶乘。
- 编写一个
switch菜单,支持加减乘除。
本篇小结
- 条件决定代码是否执行;
- 循环用于重复处理;
- 函数用于封装逻辑;
- C 的普通参数按值传递;
- 作用域决定名称在哪里可见;
- 生命周期决定对象存在多久。
下一篇
下一篇单独攻克 C 语言最重要的概念:指针、地址、解引用和二级指针。

说些什么吧!