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...