选择结构
if
一、基本语法
if (条件表达式) {
// 条件为真时执行的代码块
} else {
// 条件为假时执行的代码块(可选)
}
二、条件表达式的本质
-
条件表达式可以是任何返回整型值的表达式:
- 0 表示假(
false
)。 - 非0 表示真(
true
)。
- 0 表示假(
-
示例:
if (5) { ... }// 条件为真(非0) if (0) { ... }// 条件为假
三、常见用法
1. 单分支条件判断
if (score >= 60) {printf("及格\n");
}
2. 双分支条件判断
if (score >= 60) {printf("及格\n");
} else {printf("不及格\n");
}
3. 多分支条件判断(else if
)
if (score >= 90) {printf("优秀\n");
} else if (score >= 80) {printf("良好\n");
} else if (score >= 60) {printf("及格\n");
} else {printf("不及格\n");
}
switch
一、基本语法
switch (表达式) {case 常量1:// 代码块1break;case 常量2:// 代码块2break;default:// 默认代码块
}
二、关键规则
- 表达式类型:必须是 整型 或 枚举类型(
int
,char
,enum
等)。 - case 常量:必须是 编译时常量(如
5
、'A'
),不能是变量或范围或浮点型。 - case 穿透:若省略
break
,程序会继续执行下一个case
的代码。 - default 分支:可选,当所有
case
不匹配时执行。
三、代码示例
1. 基础示例
#include <stdio.h>int main() {char grade = 'B';switch (grade) {case 'A':printf("优秀\n");break;case 'B':printf("良好\n");break;case 'C':printf("及格\n");break;default:printf("未知等级\n");}return 0;
}
输出:良好
循环结构
while
一、基本语法
while (循环条件) {
// 循环体代码
}
- 执行流程:
- 检查条件是否为真(非0)。
- 若为真,执行循环体,然后重复步骤1;否则退出循环。
二、代码示例
1. 基础用法:打印1~5
#include <stdio.h>int main() {int i = 1;while (i <= 5) {printf("%d ", i);i++;}return 0;
}
输出:1 2 3 4 5
2. 输入验证(确保用户输入正数)
int num;
printf("请输入一个正数:");
scanf("%d", &num);
while (num <= 0) {printf("输入无效,请重新输入:");scanf("%d", &num);
}
do {} while
一、基本语法
do {
// 循环体代码(至少执行一次)
} while (循环条件);
- 执行流程:
- 先执行循环体代码。
- 检查条件是否为真(非0)。
- 若条件为真,重复步骤1;否则退出循环。
- 注意:
while
后的分号;
不可省略。
二、代码示例
1. 基础示例:输入验证(必须输入正数)
#include <stdio.h>int main() {int num;do {printf("请输入一个正数:");scanf("%d", &num);} while (num <= 0);// 若输入非正数,重复循环printf("输入正确:%d\n", num);return 0;
}
2. 计算阶乘
int n = 5, fact = 1, i = 1;
do {fact *= i;i++;
} while (i <= n);
printf("%d! = %d\n", n, fact);// 输出:5! = 120
三、do-while
vs while
特性 | do-while |
while |
---|---|---|
执行顺序 | 先执行循环体,后检查条件 | 先检查条件,后执行循环体 |
最少次数 | 至少执行1次 | 可能0次(条件初始为假时不执行) |
适用场景 | 需先执行代码再判断的场景 | 条件可能初始不满足的场景 |
for
一、基本语法
for (初始化表达式; 循环条件; 更新表达式) {
// 循环体代码
}
- 执行顺序:
- 初始化表达式:仅在循环开始时执行一次。
- 检查循环条件:若为真(非0),执行循环体;否则退出。
- 执行循环体。
- 执行更新表达式。
- 重复步骤2~4。
二、代码示例
1. 打印1~5
#include <stdio.h>int main() {for (int i = 1; i <= 5; i++) {printf("%d ", i);}return 0;
}
输出:1 2 3 4 5
2. 遍历数组
int arr[] = {10, 20, 30};
for (int i = 0; i < 3; i++) {printf("%d ", arr[i]);// 输出:10 20 30
}
三、for
vs while
特性 | for |
while |
---|---|---|
适用场景 | 循环次数已知或需精确控制 | 循环次数未知或条件复杂 |
代码紧凑 | 初始化、条件、更新集中在一行 | 循环变量需在外部声明和更新 |
变量作用域 | C99起可在初始化部分声明变量(作用域限于循环) | 变量需在外部声明 |
跳转语句
break
一、基本语法与作用
break
语句用于 立即终止当前所在的循环(for
/while
/do-while
)或 switch
语句,并跳转到其后的代码继续执行。
二、核心应用场景
1. 终止 switch
中的 case
穿透
switch (value) {case 1:printf("Case 1\n");break;// 终止switch,避免执行case 2case 2:printf("Case 2\n");break;default:printf("Default\n");
}
2. 提前退出循环
当满足特定条件时跳出循环:
for (int i = 0; i < 10; i++) {if (i == 5) {break;// 当i=5时终止循环}printf("%d ", i);// 输出:0 1 2 3 4
}
三、代码示例
1. 搜索数组元素
int arr[] = {2, 4, 6, 8, 10};
int target = 6;
int found = 0;for (int i = 0; i < 5; i++) {if (arr[i] == target) {found = 1;break;// 找到后立即退出循环}
}
printf("%s\n", found ? "找到" : "未找到");// 输出:找到
2. 多层循环中的 break
for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (j == 1) {break;// 仅跳出内层循环}printf("(%d,%d) ", i, j);}
}
// 输出:(0,0) (1,0) (2,0)
continue
一、基本语法与作用
continue
语句用于 跳过当前循环迭代的剩余代码,直接进入下一次循环的条件检查(for
/while
/do-while
)。
二、核心应用场景
1. 跳过特定条件的迭代
for (int i = 0; i < 10; i++) {if (i % 2 == 0) {continue;// 跳过偶数}printf("%d ", i);// 输出:1 3 5 7 9
}
2. 处理输入过滤
int num;
for (int i = 0; i < 5; i++) {scanf("%d", &num);if (num < 0) {continue;// 忽略负数}printf("有效输入:%d\n", num);
}
三、continue
的详细规则
-
作用范围:仅影响 最内层循环。
-
执行流程:
for
循环:跳过循环体剩余代码,执行更新表达式
,然后检查条件。while
/do-while
循环:跳过剩余代码,直接检查循环条件。
-
与
break
的区别:语句 作用 循环是否继续 break
完全终止当前循环 否 continue
跳过当前迭代,进入下一次 是(若条件仍满足)
四、代码示例
1. 跳过无效数据
处理数组时忽略非正数:
int arr[] = {3, -2, 5, 0, 7};
for (int i = 0; i < 5; i++) {if (arr[i] <= 0) {continue;}printf("%d ", arr[i]);// 输出:3 5 7
}
2. 结合嵌套循环
for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {if (j == 1) {continue;// 跳过内层循环的j=1}printf("(%d,%d) ", i, j);}
}
// 输出:(0,0) (0,2) (1,0) (1,2) (2,0) (2,2)
return
一、基本语法与作用
return
语句用于 从函数中返回一个值 并 终止当前函数的执行,将控制权交还给函数调用者。
基本形式:
return;// 用于无返回值的函数(void)
return 表达式;// 用于有返回值的函数
二、核心应用场景
1. 返回值给调用者
int add(int a, int b) {return a + b;// 返回两数之和
}int result = add(3, 5);// result = 8
2. 提前终止函数执行
int find_first_positive(int arr[], int n) {for (int i = 0; i < n; i++) {if (arr[i] > 0) {return i;// 找到正数后立即返回索引}}return -1;// 未找到时返回-1
}
3. 无返回值函数(void)中的 return
void print_hello() {printf("Hello");return;// 可省略,函数执行到末尾自动返回
}
三、return
的详细规则
-
返回值类型匹配:
返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。
float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float }
-
main函数的返回值:
main
函数返回int
类型,通常用0
表示成功,非零表示错误。int main() {// 程序逻辑return 0; }
-
不可返回局部变量的地址:
局部变量在函数结束后被销毁,返回其地址会导致未定义行为。
int* bad_example() {int x = 5;return &x;// 错误!x的內存已被释放 }
四、代码示例
1. 返回结构体
typedef struct {int x;int y;
} Point;Point create_point(int a, int b) {Point p = {a, b};return p;// 返回结构体副本
}
2. 多条件返回
int max(int a, int b) {if (a > b) {return a;} else {return b;}
}
3. 提前返回简化逻辑
int is_valid(int value) {if (value < 0) {return 0;// 提前返回无效}if (value > 100) {return 0;// 提前返回无效}return 1;// 有效
}
return
一、基本语法与作用
return
语句用于 从函数中返回一个值 并 终止当前函数的执行,将控制权交还给函数调用者。
基本形式:
return;// 用于无返回值的函数(void)
return 表达式;// 用于有返回值的函数
二、核心应用场景
1. 返回值给调用者
int add(int a, int b) {return a + b;// 返回两数之和
}int result = add(3, 5);// result = 8
2. 提前终止函数执行
int find_first_positive(int arr[], int n) {for (int i = 0; i < n; i++) {if (arr[i] > 0) {return i;// 找到正数后立即返回索引}}return -1;// 未找到时返回-1
}
3. 无返回值函数(void)中的 return
void print_hello() {printf("Hello");return;// 可省略,函数执行到末尾自动返回
}
三、return
的详细规则
-
返回值类型匹配:
返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。
float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float }
-
main函数的返回值:
main
函数返回int
类型,通常用0
表示成功,非零表示错误。int main() {// 程序逻辑return 0; }
-
不可返回局部变量的地址:
局部变量在函数结束后被销毁,返回其地址会导致未定义行为。
int* bad_example() {int x = 5;return &x;// 错误!x的內存已被释放 }
四、代码示例
1. 返回结构体
typedef struct {int x;int y;
} Point;Point create_point(int a, int b) {Point p = {a, b};return p;// 返回结构体副本
}
2. 多条件返回
int max(int a, int b) {if (a > b) {return a;} else {return b;}
}
3. 提前返回简化逻辑
int is_valid(int value) {if (value < 0) {return 0;// 提前返回无效}if (value > 100) {return 0;// 提前返回无效}return 1;// 有效
}
1# return
一、基本语法与作用
return
语句用于 从函数中返回一个值 并 终止当前函数的执行,将控制权交还给函数调用者。
基本形式:
return;// 用于无返回值的函数(void)
return 表达式;// 用于有返回值的函数
二、核心应用场景
1. 返回值给调用者
int add(int a, int b) {return a + b;// 返回两数之和
}int result = add(3, 5);// result = 8
2. 提前终止函数执行
int find_first_positive(int arr[], int n) {for (int i = 0; i < n; i++) {if (arr[i] > 0) {return i;// 找到正数后立即返回索引}}return -1;// 未找到时返回-1
}
3. 无返回值函数(void)中的 return
void print_hello() {printf("Hello");return;// 可省略,函数执行到末尾自动返回
}
三、return
的详细规则
-
返回值类型匹配:
返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。
float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float }
-
main函数的返回值:
main
函数返回int
类型,通常用0
表示成功,非零表示错误。int main() {// 程序逻辑return 0; }
-
不可返回局部变量的地址:
局部变量在函数结束后被销毁,返回其地址会导致未定义行为。
int* bad_example() {int x = 5;return &x;// 错误!x的內存已被释放 }
四、代码示例
1. 返回结构体
typedef struct {int x;int y;
} Point;Point create_point(int a, int b) {Point p = {a, b};return p;// 返回结构体副本
}
2. 多条件返回
int max(int a, int b) {if (a > b) {return a;} else {return b;}
}
3. 提前返回简化逻辑
int is_valid(int value) {if (value < 0) {return 0;// 提前返回无效}if (value > 100) {return 0;// 提前返回无效}return 1;// 有效
}
1# return
一、基本语法与作用
return
语句用于 从函数中返回一个值 并 终止当前函数的执行,将控制权交还给函数调用者。
基本形式:
return;// 用于无返回值的函数(void)
return 表达式;// 用于有返回值的函数
二、核心应用场景
1. 返回值给调用者
int add(int a, int b) {return a + b;// 返回两数之和
}int result = add(3, 5);// result = 8
2. 提前终止函数执行
int find_first_positive(int arr[], int n) {for (int i = 0; i < n; i++) {if (arr[i] > 0) {return i;// 找到正数后立即返回索引}}return -1;// 未找到时返回-1
}
3. 无返回值函数(void)中的 return
void print_hello() {printf("Hello");return;// 可省略,函数执行到末尾自动返回
}
三、return
的详细规则
-
返回值类型匹配:
返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。
float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float }
-
main函数的返回值:
main
函数返回int
类型,通常用0
表示成功,非零表示错误。int main() {// 程序逻辑return 0; }
-
不可返回局部变量的地址:
局部变量在函数结束后被销毁,返回其地址会导致未定义行为。
int* bad_example() {int x = 5;return &x;// 错误!x的內存已被释放 }
四、代码示例
1. 返回结构体
typedef struct {int x;int y;
} Point;Point create_point(int a, int b) {Point p = {a, b};return p;// 返回结构体副本
}
2. 多条件返回
int max(int a, int b) {if (a > b) {return a;} else {return b;}
}
3. 提前返回简化逻辑
int is_valid(int value) {if (value < 0) {return 0;// 提前返回无效}if (value > 100) {return 0;// 提前返回无效}return 1;// 有效
}
return
一、基本语法与作用
return
语句用于 从函数中返回一个值 并 终止当前函数的执行,将控制权交还给函数调用者。
基本形式:
return;// 用于无返回值的函数(void)
return 表达式;// 用于有返回值的函数
二、核心应用场景
1. 返回值给调用者
int add(int a, int b) {return a + b;// 返回两数之和
}int result = add(3, 5);// result = 8
2. 提前终止函数执行
int find_first_positive(int arr[], int n) {for (int i = 0; i < n; i++) {if (arr[i] > 0) {return i;// 找到正数后立即返回索引}}return -1;// 未找到时返回-1
}
3. 无返回值函数(void)中的 return
void print_hello() {printf("Hello");return;// 可省略,函数执行到末尾自动返回
}
三、return
的详细规则
-
返回值类型匹配:
返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。
float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float }
-
main函数的返回值:
main
函数返回int
类型,通常用0
表示成功,非零表示错误。
int main() {// 程序逻辑return 0;
}
-
不可返回局部变量的地址:
局部变量在函数结束后被销毁,返回其地址会导致未定义行为。
int* bad_example() {int x = 5;return &x;// 错误!x的內存已被释放 }
四、代码示例
1. 返回结构体
typedef struct {int x;int y;
} Point;Point create_point(int a, int b) {Point p = {a, b};return p;// 返回结构体副本
}
2. 多条件返回
int max(int a, int b) {if (a > b) {return a;} else {return b;}
}
3. 提前返回简化逻辑
int is_valid(int value) {if (value < 0) {return 0;// 提前返回无效}if (value > 100) {return 0;// 提前返回无效}return 1;// 有效
}
goto(非必要不用)
一、基本语法
goto 标签名;// 跳转到标签处
...
标签名:// 标签定义代码;
二、核心用途与争议
1. 合理使用场景
-
集中错误处理:
在资源分配失败时跳转到清理代码,避免重复逻辑。
int func() {FILE *f1 = fopen("a.txt", "r");if (!f1) goto ERR;FILE *f2 = fopen("b.txt", "r");if (!f2) goto CLOSE_F1;// 正常流程...fclose(f2); CLOSE_F1:fclose(f1); ERR:return -1; }
-
跳出深层嵌套循环:
替代多层
break
或标志变量。for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {if (条件) {goto EXIT_LOOP;// 直接跳出所有循环}} } EXIT_LOOP: // 后续代码
2. 争议与风险
- 代码可读性降低:过度使用
goto
会导致程序流程混乱,难以维护。 - 违反结构化编程原则:可能破坏代码的块状结构,增加调试难度。