目录
[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 语句的三种形式
- 单分支 if:
cpp
if (条件) {
语句;
}
双分支 if-else:
c
if (条件) {
语句1;
} else {
语句2;
}
- 多分支 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 语句
用于多分支选择,常与 case 和 break 配合使用。
语法:
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 函数的定义
函数定义包括:
-
返回类型
-
函数名
-
参数列表(可选)
-
函数体
语法:
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语言模块化编程的基础。
-
函数通过值传递参数,可通过指针实现地址传递。
-
递归函数需有明确的终止条件。
-
函数可传递数组,需注意数组长度和维度信息的传递。
-
变量的作用域和存储类别影响其生命周期和可见性。