第三章 【C语言篇:结构化编程】 分支循环数组函数

目录

[1. 分支结构程序设计](#1. 分支结构程序设计)

[1.1 关系运算符和表达式](#1.1 关系运算符和表达式)

[1.1.1 关系运算符及其优先次序](#1.1.1 关系运算符及其优先次序)

[1.1.2 关系表达式](#1.1.2 关系表达式)

[1.2 逻辑运算符和表达式](#1.2 逻辑运算符和表达式)

[1.2.1 逻辑运算符及其优先次序](#1.2.1 逻辑运算符及其优先次序)

[1.2.2 逻辑运算的值](#1.2.2 逻辑运算的值)

[1.2.3 逻辑表达式](#1.2.3 逻辑表达式)

[1.3 if 语句](#1.3 if 语句)

[1.3.1 if 语句的三种形式](#1.3.1 if 语句的三种形式)

[1.3.2 if 语句的嵌套](#1.3.2 if 语句的嵌套)

[1.3.3 条件运算符和条件表达式](#1.3.3 条件运算符和条件表达式)

[1.4 switch 语句](#1.4 switch 语句)

[1.5 程序举例](#1.5 程序举例)

示例:判断闰年

[2. 循环控制](#2. 循环控制)

[2.1 概述](#2.1 概述)

[2.2 goto 语句以及用 goto 语句构成循环](#2.2 goto 语句以及用 goto 语句构成循环)

[2.3 while 语句](#2.3 while 语句)

[2.4 do-while 语句](#2.4 do-while 语句)

[2.5 for 语句](#2.5 for 语句)

[2.6 循环嵌套](#2.6 循环嵌套)

[2.7 几种循环的比较](#2.7 几种循环的比较)

[2.8 break 和 continue 语句](#2.8 break 和 continue 语句)

[2.8.1 break 语句](#2.8.1 break 语句)

[2.8.2 continue 语句](#2.8.2 continue 语句)

[2.9 程序举例](#2.9 程序举例)

[示例:计算 1 到 10 的累加和](#示例:计算 1 到 10 的累加和)

[3. 数组](#3. 数组)

[3.1 一维数组的定义和引用](#3.1 一维数组的定义和引用)

[3.1.1 一维数组的定义方式](#3.1.1 一维数组的定义方式)

[3.1.2 一维数组元素的引用](#3.1.2 一维数组元素的引用)

[3.1.3 一维数组的初始化](#3.1.3 一维数组的初始化)

[3.1.4 一维数组程序举例](#3.1.4 一维数组程序举例)

[3.2 二维数组的定义和引用](#3.2 二维数组的定义和引用)

[3.2.1 二维数组的定义](#3.2.1 二维数组的定义)

[3.2.2 二维数组元素的引用](#3.2.2 二维数组元素的引用)

[3.2.3 二维数组的初始化](#3.2.3 二维数组的初始化)

[3.2.4 二维数组程序举例](#3.2.4 二维数组程序举例)

[3.3 字符数组](#3.3 字符数组)

[3.3.1 字符数组的定义](#3.3.1 字符数组的定义)

[3.3.2 字符数组的初始化](#3.3.2 字符数组的初始化)

[3.3.3 字符数组的引用](#3.3.3 字符数组的引用)

[3.3.4 字符串和字符串结束标志](#3.3.4 字符串和字符串结束标志)

[4. 函数](#4. 函数)

[4.1 函数概述](#4.1 函数概述)

[4.2 函数的定义与调用](#4.2 函数的定义与调用)

[4.2.1 函数的定义](#4.2.1 函数的定义)

[4.2.2 函数的调用](#4.2.2 函数的调用)

[4.3 函数的参数传递](#4.3 函数的参数传递)

[4.3.1 值传递](#4.3.1 值传递)

[4.3.2 地址传递(通过指针)](#4.3.2 地址传递(通过指针))

[4.4 函数的返回值](#4.4 函数的返回值)

[4.5 函数的声明](#4.5 函数的声明)

[4.6 递归函数](#4.6 递归函数)

[4.7 函数与数组](#4.7 函数与数组)

[4.7.1 传递一维数组](#4.7.1 传递一维数组)

[4.7.2 传递二维数组](#4.7.2 传递二维数组)

[4.8 函数的作用域与存储类别](#4.8 函数的作用域与存储类别)

[4.8.1 局部变量与全局变量](#4.8.1 局部变量与全局变量)

[4.8.2 静态局部变量](#4.8.2 静态局部变量)

[4.9 程序举例](#4.9 程序举例)

示例:判断素数函数

[4.10 本章小结](#4.10 本章小结)


本文围绕 C 语言分支控制、循环控制、数组、函数四大核心模块展开梳理,系统讲解关系与逻辑运算的使用规则、分支与循环的多种实现形式、数组的定义与操作方法,以及函数的封装、调用与参数传递逻辑,并结合典型编程案例实现知识点落地。这些内容不仅是 C 语言语法体系的基础,更是培养编程逻辑思维、建立模块化编程思想的关键,掌握其核心用法与设计思路,既能解决日常编程中的基础问题,也能为后续学习指针、结构体、文件操作等高级内容筑牢根基。

1. 分支结构程序设计

1.1 关系运算符和表达式

1.1.1 关系运算符及其优先次序

关系运算符用于比较两个值的大小关系,结果为真(非0)或假(0)。

C语言中的关系运算符如下:

  • >(大于)

  • <(小于)

  • >=(大于等于)

  • <=(小于等于)

  • ==(等于)

  • !=(不等于)

优先次序

  • 前四个(>, <, >=, <=)优先级相同,高于后两个(==, !=)。

  • 关系运算符的优先级低于算术运算符,高于赋值运算符。

1.1.2 关系表达式

用关系运算符将两个表达式连接起来的式子称为关系表达式。

关系表达式的值为 1 (真)或 0(假)。

示例

cpp 复制代码
int a = 5, b = 3;
int result = (a > b);  // result 的值为 1,因为 5 > 3 为真

1.2 逻辑运算符和表达式

1.2.1 逻辑运算符及其优先次序

逻辑运算符用于组合多个条件,包括:

  • &&(逻辑与)

  • ||(逻辑或)

  • !(逻辑非)

优先次序

  • !(最高)→ &&||(最低)
1.2.2 逻辑运算的值

逻辑运算的结果为 1 (真)或 0 (假)。

逻辑运算遵循"短路求值"原则:

  • &&:若左侧为假,右侧不再计算。

  • ||:若左侧为真,右侧不再计算。

1.2.3 逻辑表达式

用逻辑运算符将关系表达式或逻辑量连接起来的式子。

示例

cpp 复制代码
int x = 5, y = 10, z = 15;
if (x < y && y < z) {
    printf("y 在 x 和 z 之间\n");
}

1.3 if 语句

1.3.1 if 语句的三种形式
  1. 单分支 if
cpp 复制代码
if (条件) {
    语句;
}
双分支 if-else:

c

if (条件) {
    语句1;
} else {
    语句2;
}
  1. 多分支 else-if
cpp 复制代码
if (条件1) {
    语句1;
} else if (条件2) {
    语句2;
} else {
    语句3;
}
1.3.2 if 语句的嵌套

在 if 或 else 分支中再包含 if 语句。

示例

cpp 复制代码
int score = 85;
if (score >= 60) {
    if (score >= 90) {
        printf("优秀\n");
    } else {
        printf("及格\n");
    }
} else {
    printf("不及格\n");
}
1.3.3 条件运算符和条件表达式

条件运算符是 ? :,是唯一的三目运算符。

语法:表达式1 ? 表达式2 : 表达式3

示例

cpp 复制代码
int a = 5, b = 3;
int max = (a > b) ? a : b;  // 若 a > b,max = a,否则 max = b
printf("较大值是:%d\n", max);

1.4 switch 语句

用于多分支选择,常与 casebreak 配合使用。

语法

cpp 复制代码
switch (表达式) {
    case 常量1:
        语句1;
        break;
    case 常量2:
        语句2;
        break;
    default:
        语句n;
}

示例

cpp 复制代码
int day = 3;
switch (day) {
    case 1:
        printf("星期一\n");
        break;
    case 2:
        printf("星期二\n");
        break;
    case 3:
        printf("星期三\n");  // 输出这一行
        break;
    default:
        printf("无效输入\n");
}

1.5 程序举例

示例:判断闰年
cpp 复制代码
#include <stdio.h>

int main() {
    int year;
    printf("请输入年份:");
    scanf("%d", &year);

    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        printf("%d 年是闰年\n", year);
    } else {
        printf("%d 年不是闰年\n", year);
    }
    return 0;
}

2. 循环控制

2.1 概述

循环结构用于重复执行一段代码,直到满足终止条件。

2.2 goto 语句以及用 goto 语句构成循环

goto 语句无条件跳转到标签处,可构造循环,但易使程序混乱,不推荐使用。

示例

cpp 复制代码
int i = 1;
loop:
    if (i <= 5) {
        printf("%d ", i);
        i++;
        goto loop;
    }

2.3 while 语句

先判断条件,再执行循环体。

语法

cpp 复制代码
while (条件) {
    循环体;
}

示例

cpp 复制代码
int i = 1;
while (i <= 5) {
    printf("%d ", i);
    i++;
}
// 输出:1 2 3 4 5

2.4 do-while 语句

先执行一次循环体,再判断条件。

语法

cpp 复制代码
do {
    循环体;
} while (条件);

示例

cpp 复制代码
int i = 1;
do {
    printf("%d ", i);
    i++;
} while (i <= 5);
// 输出:1 2 3 4 5

2.5 for 语句

最常用的循环结构,包含初始化、条件判断和更新三部分。

语法

cpp 复制代码
for (初始化; 条件; 更新) {
    循环体;
}

示例

cpp 复制代码
for (int i = 1; i <= 5; i++) {
    printf("%d ", i);
}
// 输出:1 2 3 4 5

2.6 循环嵌套

在一个循环体内包含另一个循环。

示例

cpp 复制代码
for (int i = 1; i <= 3; i++) {
    for (int j = 1; j <= 3; j++) {
        printf("(%d, %d) ", i, j);
    }
    printf("\n");
}
// 输出:
// (1,1) (1,2) (1,3)
// (2,1) (2,2) (2,3)
// (3,1) (3,2) (3,3)

2.7 几种循环的比较

  • for:适合循环次数已知的情况。

  • while:适合循环次数未知,先判断后执行。

  • do-while:至少执行一次,适合先执行后判断的场景。

  • goto:灵活性高,但可读性差,应避免使用。


2.8 break 和 continue 语句

2.8.1 break 语句

用于跳出当前循环或 switch 语句。

示例

cpp 复制代码
for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;  // 当 i 等于 5 时跳出循环
    }
    printf("%d ", i);
}
// 输出:1 2 3 4
2.8.2 continue 语句

用于跳过本次循环剩余部分,进入下一次循环。

示例

cpp 复制代码
for (int i = 1; i <= 5; i++) {
    if (i == 3) {
        continue;  // 跳过 i=3 的这次循环
    }
    printf("%d ", i);
}
// 输出:1 2 4 5

2.9 程序举例

示例:计算 1 到 10 的累加和
cpp 复制代码
#include <stdio.h>

int main() {
    int sum = 0;
    for (int i = 1; i <= 10; i++) {
        sum += i;  // 累加
    }
    printf("1 到 10 的和为:%d\n", sum);  // 输出 55
    return 0;
}

3. 数组

3.1 一维数组的定义和引用

3.1.1 一维数组的定义方式
cpp 复制代码
数据类型 数组名[数组长度];

示例

cpp 复制代码
int numbers[5];  // 定义一个长度为5的整型数组
3.1.2 一维数组元素的引用

数组元素通过下标访问,下标从 0 开始。

示例

cpp 复制代码
int arr[3] = {1, 2, 3};
printf("%d\n", arr[0]);  // 输出 1
3.1.3 一维数组的初始化

可在定义时初始化:

cpp 复制代码
int arr[5] = {1, 2, 3, 4, 5};  // 完全初始化
int arr2[5] = {1, 2};          // 部分初始化,其余为0
int arr3[] = {1, 2, 3};        // 自动确定长度为3
3.1.4 一维数组程序举例
cpp 复制代码
#include <stdio.h>

int main() {
    int arr[5], sum = 0;
    printf("请输入5个整数:\n");
    for (int i = 0; i < 5; i++) {
        scanf("%d", &arr[i]);
        sum += arr[i];
    }
    printf("数组元素之和为:%d\n", sum);
    return 0;
}

3.2 二维数组的定义和引用

3.2.1 二维数组的定义
cpp 复制代码
数据类型 数组名[行数][列数];

示例

cpp 复制代码
int matrix[3][4];  // 3行4列的二维数组
3.2.2 二维数组元素的引用

通过行下标和列下标访问。

示例

cpp 复制代码
matrix[1][2] = 10;  // 第2行第3列赋值为10
3.2.3 二维数组的初始化
cpp 复制代码
int matrix[2][3] = {
    {1, 2, 3},
    {4, 5, 6}
};
3.2.4 二维数组程序举例
cpp 复制代码
#include <stdio.h>

int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    return 0;
}

3.3 字符数组

3.3.1 字符数组的定义

用于存储字符串或字符序列。

cpp 复制代码
char str[10];  // 可存储最多9个字符的字符串(留1位给结束符)
3.3.2 字符数组的初始化
cpp 复制代码
char str1[] = "Hello";        // 自动包含结束符 '\0'
char str2[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
3.3.3 字符数组的引用

与一维数组类似,可通过下标访问每个字符。

示例

cpp 复制代码
char str[] = "Hello";
printf("%c\n", str[1]);  // 输出 'e'
3.3.4 字符串和字符串结束标志

C语言中,字符串以 '\0'(空字符)作为结束标志。

示例

cpp 复制代码
char str[] = "Hello";
printf("%s\n", str);  // 输出 Hello

4. 函数

4.1 函数概述

函数是C语言中用于封装一段可重复使用的代码块的基本单位。每个C程序至少包含一个主函数 main(),程序执行从 main() 开始。通过函数,可以实现代码的模块化、提高代码的复用性和可维护性。

函数的作用

  • 代码复用

  • 功能封装

  • 提高可读性

  • 便于调试和维护


4.2 函数的定义与调用

4.2.1 函数的定义

函数定义包括:

  1. 返回类型

  2. 函数名

  3. 参数列表(可选)

  4. 函数体

语法

cpp 复制代码
返回类型 函数名(参数列表) {
    // 函数体
}

示例

cpp 复制代码
// 定义一个无返回值、无参数的函数
void sayHello() {
    printf("Hello, World!\n");
}

// 定义一个有返回值、有参数的函数
int add(int a, int b) {
    return a + b;
}

4.2.2 函数的调用

函数通过函数名加括号和参数(如果有)来调用。

示例

cpp 复制代码
#include <stdio.h>

// 函数声明
int add(int a, int b);

int main() {
    int result = add(5, 3);  // 调用 add 函数
    printf("5 + 3 = %d\n", result);
    return 0;
}

int add(int a, int b) {
    return a + b;
}

4.3 函数的参数传递

4.3.1 值传递

C语言中,函数参数默认采用值传递,即传递的是实参的副本,函数内部对形参的修改不会影响实参。

示例

cpp 复制代码
#include <stdio.h>

void swap(int x, int y) {
    int temp = x;
    x = y;
    y = temp;
    printf("函数内:x = %d, y = %d\n", x, y);
}

int main() {
    int a = 5, b = 10;
    printf("交换前:a = %d, b = %d\n", a, b);
    swap(a, b);
    printf("交换后:a = %d, b = %d\n", a, b);  // a, b 值未变
    return 0;
}

4.3.2 地址传递(通过指针)

若希望函数内部修改实参的值,可传递实参的地址(指针)。

示例

cpp 复制代码
#include <stdio.h>

void swap(int *x, int *y) {
    int temp = *x;
    *x = *y;
    *y = temp;
}

int main() {
    int a = 5, b = 10;
    printf("交换前:a = %d, b = %d\n", a, b);
    swap(&a, &b);  // 传递地址
    printf("交换后:a = %d, b = %d\n", a, b);  // a, b 值已交换
    return 0;
}

4.4 函数的返回值

函数可以通过 return 语句返回一个值。返回值的类型必须与函数定义中的返回类型一致。

示例

cpp 复制代码
#include <stdio.h>

// 返回两个整数中的较大值
int max(int a, int b) {
    if (a > b) {
        return a;
    } else {
        return b;
    }
}

int main() {
    int x = 7, y = 12;
    int m = max(x, y);
    printf("较大值是:%d\n", m);
    return 0;
}

4.5 函数的声明

函数声明告诉编译器函数的名称、返回类型和参数列表,使编译器在函数调用之前知道函数的存在。

声明方式

cpp 复制代码
返回类型 函数名(参数列表);

示例

cpp 复制代码
#include <stdio.h>

// 函数声明
int multiply(int a, int b);

int main() {
    int result = multiply(4, 5);
    printf("4 * 5 = %d\n", result);
    return 0;
}

// 函数定义
int multiply(int a, int b) {
    return a * b;
}

4.6 递归函数

递归函数是指函数直接或间接调用自身的函数。递归必须有一个明确的终止条件,否则会导致无限递归。

示例:计算阶乘

cpp 复制代码
#include <stdio.h>

// 递归函数计算 n!
int factorial(int n) {
    if (n == 0 || n == 1) {
        return 1;  // 终止条件
    } else {
        return n * factorial(n - 1);  // 递归调用
    }
}

int main() {
    int num = 5;
    printf("%d! = %d\n", num, factorial(num));
    return 0;
}

4.7 函数与数组

4.7.1 传递一维数组

传递数组时,实际上传递的是数组的首地址。通常需要同时传递数组长度。

示例

cpp 复制代码
#include <stdio.h>

// 函数接收整型数组和其长度
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int numbers[] = {1, 2, 3, 4, 5};
    int length = sizeof(numbers) / sizeof(numbers[0]);
    printArray(numbers, length);
    return 0;
}

4.7.2 传递二维数组

传递二维数组时,必须指定列数。

示例

cpp 复制代码
#include <stdio.h>

// 函数接收二维数组,行数可变,列数固定为3
void printMatrix(int rows, int cols, int mat[][3]) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", mat[i][j]);
        }
        printf("\n");
    }
}

int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    printMatrix(2, 3, matrix);
    return 0;
}

4.8 函数的作用域与存储类别

4.8.1 局部变量与全局变量

  • 局部变量:在函数内部定义,只在该函数内有效。

  • 全局变量:在函数外部定义,从定义处到文件末尾都有效。

示例

cpp 复制代码
#include <stdio.h>

int globalVar = 100;  // 全局变量

void test() {
    int localVar = 50;  // 局部变量
    printf("局部变量:%d\n", localVar);
    printf("全局变量:%d\n", globalVar);
}

int main() {
    test();
    // printf("%d\n", localVar);  // 错误:局部变量不可访问
    printf("全局变量:%d\n", globalVar);
    return 0;
}

4.8.2 静态局部变量

使用 static 声明的局部变量在函数调用结束后不会被销毁,其值会保留到下一次调用。

示例

cpp 复制代码
#include <stdio.h>

void counter() {
    static int count = 0;  // 静态局部变量
    count++;
    printf("调用次数:%d\n", count);
}

int main() {
    counter();  // 1
    counter();  // 2
    counter();  // 3
    return 0;
}

4.9 程序举例

示例:判断素数函数

cpp 复制代码
#include <stdio.h>
#include <stdbool.h>

// 判断素数的函数
bool isPrime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i * i <= n; i++) {
        if (n % i == 0) {
            return false;
        }
    }
    return true;
}

int main() {
    int num;
    printf("请输入一个整数:");
    scanf("%d", &num);

    if (isPrime(num)) {
        printf("%d 是素数。\n", num);
    } else {
        printf("%d 不是素数。\n", num);
    }
    return 0;
}

4.10 本章小结

  • 函数是C语言模块化编程的基础。

  • 函数通过值传递参数,可通过指针实现地址传递。

  • 递归函数需有明确的终止条件。

  • 函数可传递数组,需注意数组长度和维度信息的传递。

  • 变量的作用域和存储类别影响其生命周期和可见性。

相关推荐
Z9fish2 小时前
sse哈工大C语言编程练习22
c语言·开发语言·算法
代码无bug抓狂人2 小时前
C语言之产值调整(蓝桥杯省B)
c语言·开发语言·蓝桥杯
Cx330❀2 小时前
深入理解 Linux 基础 IO:从 C 库到系统调用的完整剖析
linux·运维·服务器·c语言·数据库·人工智能·科技
西电研梦2 小时前
26西电考研 | 寒假开始,机试 or C语言程序设计怎么准备?
c语言·考研·华为od·研究生·西安电子科技大学·计算机408
CC.GG2 小时前
【Linux】基础I/O----C语言文件操作与系统调用文件操作
linux·c语言·网络
学嵌入式的小杨同学3 小时前
【嵌入式 GUI 实战】LVGL+MP3 播放器:从环境搭建到图形界面开发全指南
linux·c语言·开发语言·vscode·vim·音频·ux
1+α3 小时前
汽车里的“神经网络”——CAN总线科普
c语言·stm32·嵌入式硬件·信息与通信
爱编码的小八嘎3 小时前
C语言对话-19.新的起点,第一部分
c语言
草莓熊Lotso5 小时前
Linux 基础 IO 初步解析:从 C 库函数到系统调用,理解文件操作本质
linux·运维·服务器·c语言·数据库·c++·人工智能