解码C语言九条语句

C语言三大控制结构解析

选择结构

if

基本语法
if (条件表达式) {
	// 条件为真时执行的代码块
} 
else {
	// 条件为假时执行的代码块(可选)
}
条件表达式的本质
  • 条件表达式可以是任何返回整型值的表达式

    • 0 表示假(false)。
    • 非0 表示真(true)。
  • 示例

    if (5) { ... }// 条件为真(非0)
    if (0) { ... }// 条件为假
    
常见用法
单分支条件判断
if (score >= 60) {
    printf("及格\n");
}
双分支条件判断
if (score >= 60) {
    printf("及格\n");
} 
else {
    printf("不及格\n");
}
多分支条件判断(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:
			// 代码块1
			break;
    case 常量2:
			// 代码块2
			break;
    default:
			// 默认代码块
}
关键规则
  • 表达式类型:必须是 整型枚举类型int, char, enum 等)。
  • case 常量:必须是 编译时常量(如 5'A'),不能是变量或范围或浮点型。
  • case 穿透:若省略 break,程序会继续执行下一个 case 的代码。
  • default 分支:可选,当所有 case 不匹配时执行。
代码示例
基础示例
#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 (循环条件) {
	// 循环体代码
}
  • 执行流程
    1. 检查条件是否为真(非0)。
    2. 若为真,执行循环体,然后重复步骤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

输入验证(确保用户输入正数)
int num;
printf("请输入一个正数:");
scanf("%d", &num);
while (num <= 0) {
    printf("输入无效,请重新输入:");
    scanf("%d", &num);
}

do {} while

基本语法
do {
	// 循环体代码(至少执行一次)
} while (循环条件);
  • 执行流程
    1. 先执行循环体代码。
    2. 检查条件是否为真(非0)。
    3. 若条件为真,重复步骤1;否则退出循环。
  • 注意while 后的分号 ; 不可省略。
代码示例
基础示例:输入验证(必须输入正数)
#include <stdio.h>
int main() {
    int num;
    do {
        printf("请输入一个正数:");
        scanf("%d", &num);
    } while (num <= 0);// 若输入非正数,重复循环printf("输入正确:%d\n", num);
    return 0;
}
计算阶乘
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-whilewhile
执行顺序先执行循环体,后检查条件先检查条件,后执行循环体
最少次数至少执行1次可能0次(条件初始为假时不执行)
适用场景需先执行代码再判断的场景条件可能初始不满足的场景

for

基本语法
for (初始化表达式; 循环条件; 更新表达式) {
	// 循环体代码
}
  • 执行顺序
    1. 初始化表达式:仅在循环开始时执行一次。
    2. 检查循环条件:若为真(非0),执行循环体;否则退出。
    3. 执行循环体
    4. 执行更新表达式
    5. 重复步骤2~4。
代码示例
打印1~5
#include <stdio.h>
int main() {
    for (int i = 1; i <= 5; i++) {
        printf("%d ", i);
    }
    return 0;
}

输出1 2 3 4 5

遍历数组
int arr[] = {10, 20, 30};
for (int i = 0; i < 3; i++) {
    printf("%d ", arr[i]);// 输出:10 20 30
}
for vs while
特性forwhile
适用场景循环次数已知或需精确控制循环次数未知或条件复杂
代码紧凑初始化、条件、更新集中在一行循环变量需在外部声明和更新
变量作用域C99起可在初始化部分声明变量(作用域限于循环)变量需在外部声明

跳转语句

break

基本语法与作用

break 语句用于 立即终止当前所在的循环(for/while/do-while)或 switch 语句,并跳转到其后的代码继续执行。

核心应用场景
终止 switch 中的 case 穿透
switch (value) {
    case 1:
        printf("Case 1\n");
        break;// 终止switch,避免执行case 2
    case 2:
        printf("Case 2\n");
        break;
    default:
        printf("Default\n");
}
提前退出循环

当满足特定条件时跳出循环:

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break;// 当i=5时终止循环
    }
    printf("%d ", i);// 输出:0 1 2 3 4
}
代码示例
搜索数组元素
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 ? "找到" : "未找到");// 输出:找到
多层循环中的 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)。

核心应用场景
跳过特定条件的迭代
for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        continue;// 跳过偶数
    }
    printf("%d ", i);// 输出:1 3 5 7 9
}
处理输入过滤
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跳过当前迭代,进入下一次是(若条件仍满足)
代码示例
跳过无效数据

处理数组时忽略非正数:

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
}
结合嵌套循环
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 表达式;// 用于有返回值的函数
核心应用场景
返回值给调用者
int add(int a, int b) {
    return a + b;// 返回两数之和
}

int result = add(3, 5);// result = 8
提前终止函数执行
int find_first_positive(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        if (arr[i] > 0) {
            return i;// 找到正数后立即返回索引
        }
    }
    return -1;// 未找到时返回-1
}
无返回值函数(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的內存已被释放
}
代码示例
返回结构体
typedef struct {
    int x;
    int y;
} Point;

Point create_point(int a, int b) {
    Point p = {a, b};
    return p;// 返回结构体副本
}
多条件返回
int max(int a, int b) {
    if (a > b) {
        return a;
    } 
    else {
        return b;
    }
}
提前返回简化逻辑
int is_valid(int value) {
    if (value < 0) {
        return 0;// 提前返回无效
    }
    if (value > 100) {
        return 0;// 提前返回无效
    }
    return 1;// 有效
}

goto(非必要不用)

基本语法
goto 标签名;// 跳转到标签处
...
标签名:// 标签定义
    代码;
核心用途与争议
合理使用场景
  • 集中错误处理

    在资源分配失败时跳转到清理代码,避免重复逻辑。

    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:
    // 后续代码
    
争议与风险
  • 代码可读性降低:过度使用 goto 会导致程序流程混乱,难以维护。
  • 违反结构化编程原则:可能破坏代码的块状结构,增加调试难度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值