当前位置: 首页 > news >正文

解码C语言九条语句

选择结构

if

一、基本语法

if (条件表达式) {
// 条件为真时执行的代码块
} else {
// 条件为假时执行的代码块(可选)
}

二、条件表达式的本质

  • 条件表达式可以是任何返回整型值的表达式

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

    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:// 默认代码块
}

二、关键规则

  1. 表达式类型:必须是 整型枚举类型intcharenum 等)。
  2. case 常量:必须是 编译时常量(如 5'A'),不能是变量或范围或浮点型。
  3. case 穿透:若省略 break,程序会继续执行下一个 case 的代码。
  4. 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 (循环条件) {
// 循环体代码
}
  • 执行流程
    1. 检查条件是否为真(非0)。
    2. 若为真,执行循环体,然后重复步骤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 (循环条件);
  • 执行流程
    1. 先执行循环体代码。
    2. 检查条件是否为真(非0)。
    3. 若条件为真,重复步骤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 (初始化表达式; 循环条件; 更新表达式) {
// 循环体代码
}
  • 执行顺序
    1. 初始化表达式:仅在循环开始时执行一次。
    2. 检查循环条件:若为真(非0),执行循环体;否则退出。
    3. 执行循环体
    4. 执行更新表达式
    5. 重复步骤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 的详细规则

  1. 作用范围:仅影响 最内层循环

  2. 执行流程

    • for 循环:跳过循环体剩余代码,执行 更新表达式,然后检查条件。
    • while/do-while 循环:跳过剩余代码,直接检查循环条件。
  3. 与 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 的详细规则

  1. 返回值类型匹配

    返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。

    float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float
    }
    
  2. main函数的返回值

    main 函数返回 int 类型,通常用 0 表示成功,非零表示错误。

    int main() {// 程序逻辑return 0;
    }
    
  3. 不可返回局部变量的地址

    局部变量在函数结束后被销毁,返回其地址会导致未定义行为。

    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 的详细规则

  1. 返回值类型匹配

    返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。

    float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float
    }
    
  2. main函数的返回值

    main 函数返回 int 类型,通常用 0 表示成功,非零表示错误。

    int main() {// 程序逻辑return 0;
    }
    
  3. 不可返回局部变量的地址

    局部变量在函数结束后被销毁,返回其地址会导致未定义行为。

    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 的详细规则

  1. 返回值类型匹配

    返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。

    float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float
    }
    
  2. main函数的返回值

    main 函数返回 int 类型,通常用 0 表示成功,非零表示错误。

    int main() {// 程序逻辑return 0;
    }
    
  3. 不可返回局部变量的地址

    局部变量在函数结束后被销毁,返回其地址会导致未定义行为。

    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 的详细规则

  1. 返回值类型匹配

    返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。

    float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float
    }
    
  2. main函数的返回值

    main 函数返回 int 类型,通常用 0 表示成功,非零表示错误。

    int main() {// 程序逻辑return 0;
    }
    
  3. 不可返回局部变量的地址

    局部变量在函数结束后被销毁,返回其地址会导致未定义行为。

    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 的详细规则

  1. 返回值类型匹配

    返回值必须与函数声明类型兼容,否则编译器可能警告或自动转换。

    float divide(int a, int b) {return a / b;// 返回int值会被隐式转为float
    }
    
  2. main函数的返回值
    main 函数返回 int 类型,通常用 0 表示成功,非零表示错误。

int main() {// 程序逻辑return 0;
}
  1. 不可返回局部变量的地址

    局部变量在函数结束后被销毁,返回其地址会导致未定义行为。

    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 会导致程序流程混乱,难以维护。
  • 违反结构化编程原则:可能破坏代码的块状结构,增加调试难度。
http://www.wxhsa.cn/company.asp?id=6941

相关文章:

  • 多个 root 用户记录,而且有些记录的密码是空的,导致认证混乱。
  • 解题报告-P11670 [USACO25JAN] Cow Checkups S
  • word vba 对 带编号格式的PO单 段落下添加对应的图片
  • 解题报告-P11671 [USACO25JAN] Farmer Johns Favorite Operation S
  • 解码C语言运算符
  • 多进程
  • 93. 递归实现组合型枚举
  • Sort方法学习(伪代码记录)
  • 深入解析:【每日一问】运算放大器与比较器有什么区别?
  • 9.17支配对问题专题总结
  • 记录知识
  • AT_agc058_b [AGC058B] Adjacent Chmax
  • Jenkins CVE-2018-1000600漏洞利用与SSRF攻击分析
  • NOIP 集训日记(学术)
  • linux中mysql如何远程连接
  • 详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
  • 深入解析:PYcharm——pyqt音乐播放器
  • Day02
  • 专题:Python实现贝叶斯线性回归与MCMC采样数据可视化分析2实例|附代码数据
  • 威联通NAS如何导入本地docker镜像
  • 【学习笔记】拉格朗日插值
  • 一种将离散化状态方程映射为并行多处理器计算机的方法
  • 基本数据类型题目
  • 一种基于动作指令交互的动态活体检测技术,提升人脸识别安全性
  • [系统] Windows 已有office版本和visio不兼容的解决方案
  • CF 2127F Hamed and AghaBalaSar
  • AT_agc055_b [AGC055B] ABC Supremacy
  • “Sequential Thinking MCP Server 和codex等AI工具本身任务拆解功能对比
  • 基于错误xsleak 悬空标记 运用css利用帧计数 -- Pure leak ASIS CTF 2025
  • 网易伏羲:当算法遇见社交,解码游戏世界的连接密码