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

暑期自学嵌入式——Day01(C语言阶段)

点关注不迷路哟。你的点赞、收藏,一键三连,是我持续更新的动力哟!!!

主页:

一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm=1011.2682.3001.5343感悟:

       今天我认为最重要的就是:vim编辑器的快捷指令(使用方法)

目录

嵌入式开发:文件和目录相关命令

1.命令pwd

作用

示例

补充说明

2.命令ls

3.命令查看文件内容:cat

4.复制命令:cp命令

5.文件移动命令:mv

6.创建和删除文件命令:touch和rm

7.创建和删除目录命令:mkdir和rm -r

8.vi编辑器的使用(1)

8.1 三种模式:

8.2 插入模式中的常用命令

a/A

i/I

o/O

8.3 便捷命令

9. vim编辑器使用(2)

嵌入式开发基础知识

编程基础知识

计算机基本结构

冯诺依曼模型

存储器的分类

什么是程序

程序的定义

程序从程序员角度看

程序在处理器中的执行过程

程序设计语言的发展

机器语言

汇编语言

高级语言

程序设计步骤

总结

知识小结

数据的表示

计算机数据表示

数值数据的表示

基数与各数位的权

二进制

十六进制

八进制

应用案例

例题:十进制转二进制

原码、反码和补码

非数值数据表示

ASCII 编码

编码分区

编码细节

总结与思考

知识小结

程序的编译和调试

gcc 编译器

实例操作

实战演练

程序调试

基础调试宏

调试宏使用示例

实际应用价值

C 语言基础

程序的基本组成

算法基础概念

简单算法实例

代码实现演示

总结

课程要点回顾

扩展思考

知识小结


嵌入式开发:文件和目录相关命令

1.命令pwd

pwd 是 Linux 和 Unix 类操作系统中一个非常基础且常用的命令,它的全称是 Print Working Directory(打印工作目录)。

作用

pwd 命令的核心功能是 显示当前终端会话中你所在的目录路径。简单来说,当你在终端中操作时,通过执行 pwd 可以快速知道自己当前 “身处” 文件系统的哪个位置。

示例

假设你的终端当前处于用户主目录下的 Documents/project 文件夹中,输入 pwd 后,终端会输出该路径:

/home/你的用户名/Documents/project

补充说明

  • 该命令没有复杂的参数,最常用的就是直接输入 pwd 并回车。

  • 它常与 cd(切换目录)、ls(列出目录内容)等命令配合使用,帮助用户在文件系统中定位和导航。

  • 在某些特殊场景下,pwd 可能会显示不同的路径(如处理符号链接时),但默认情况下,它展示的是当前所在目录的绝对路径(从根目录 / 开始的完整路径)。

总之,pwd 是一个用于 “定位自身位置” 的便捷工具,对于终端操作来说是基础中的基础。

2.命令ls

常用的选项是:

ls -l (列举权限出来)
​
ls -a (将隐藏文件一起列举出来)
​
ls -R (列举包含目录文件的递归)

3.命令查看文件内容:cat

cat -s :合并多个空行变成一个空行显示
cat -b :显示行号   《 = 》 等效于:nl 文件名

4.复制命令:cp命令

  • 基本语法:

    • cp 源文件 目标路径:保留原文件名复制

    • cp 源文件 新文件名:复制并重命名

  • 关键选项:

    • -i:覆盖前交互提示(安全防护)

    • -r:递归复制目录及其内容

  • 实用技巧:

    • 支持同时复制多个文件到目录:cp file1 file2 dir/

    • 路径表示:

      • 相对路径:../表示上级目录

      • 绝对路径:/home/linux/完整路径

5.文件移动命令:mv

  • 双重功能:

    • 移动文件:mv 文件 新路径

    • 重命名:mv 旧文件名 新文件名

  • 复合操作:

    • 移动+重命名:mv test3.c ../test_three.c

  • 批量操作:

    • 支持同时移动多个文件

  • 注意事项:

    • 与复制命令不同,移动后原位置文件会消失

    • 重命名本质是在同一目录下的移动操作

6.创建和删除文件命令:touch和rm

  • touch命令:

    • 创建新文件:touch 新文件名(创建0字节文件)

    • 更新时间戳:对已存在文件使用会更新修改时间

    • 示例:touch a.c创建空C源文件

  • rm命令:

    • 普通文件:rm 文件名

    • 目录:必须加-r参数递归删除

    安全选项:

    • -i:删除前确认(建议常备)

  • 危险操作:

    • 不加-r删除目录会报错

    • 无提示删除可能导致数据丢失

7.创建和删除目录命令:mkdir和rm -r

  • mkdir命令:

    • 基本创建:mkdir 目录名

    • 级联创建:mkdir -p dir1/dir2(自动创建父目录)

  • 删除目录:

    • 必须使用rm -r 目录名递归删除

  • 操作验证:

    • 可用ls -R查看目录树结构确认创建结果

8.vi编辑器的使用(1)

8.1 三种模式:

  • 命令行模式: 用户在用vi编辑文件时最初进入的模式,可以进行复制、粘贴等操作。

  • 插入模式:按“i” 进行文件编辑,按ESC键可以回到命令行模式。

  • 底行模式: 光标位于屏幕的底行,可以进行文查找、替换、列出行号等操作。

8.2 插入模式中的常用命令

在 Vim 编辑器中,ai 是进入插入模式的常用命令,用于在文本中插入或添加内容。但它们的具体插入位置有所不同:

a/A
  • a:在当前光标所在位置之后进入插入模式,新输入内容会接在光标后。比如光标在 “te|st” 的|处(即 “t” 和 “e” 间 ),按a后输入 “x”,就变成 “texst”。

  • A:直接跳到当前行的行尾,然后进入插入模式,输入内容追加在行末尾。像行内容是 “hello |world”(| 为光标位置 ),按A输入 “!” ,就成 “hello world!” 。

i/I
  • i:在当前光标所在位置之前进入插入模式,新内容插在光标前。例如光标在 “t|est” 的|处,按i输入 “x” ,变为 “txest” 。

  • I:直接跳到当前行的行首,进入插入模式,输入内容添加在行开头。若行是 “|hello world”(| 为光标位置 ),按I输入 “hi” ,就成 “hi hello world” 。

o/O
  • o:在当前光标所在行的下方,新建一行空白行,光标跳到这新行的行首,进入插入模式,方便在下方新增内容。比如当前行是 “第一行”,按o后,下方出现空白行,可直接输入 “第二行内容” 。

  • O:在当前光标所在行的上方,新建一行空白行,光标移到新行行首进入插入模式,用于在上方插入内容。如当前行是 “第二行”,按O后,上方出现空白行,可输入 “第一行内容” 。

8.3 便捷命令

  • [N]x:删除光标位置起的 N 个字符(默认 1 个),删除内容会存入编辑缓冲区(可理解为 “剪切”,删的内容能粘贴 )。

  • [N]dd:删除(剪切)光标所在行起的 N 行内容,存入编辑缓冲区。

  • [N]yy:复制光标所在行起的 N 行内容到编辑缓冲区(“拷贝” 核心命令 )。

  • p/P:从缓冲区取内容粘贴;p 贴在光标后,P 贴在光标前。

  • u:撤销上一步操作(比如误删、误改时,快速回退 )。

这些是 vi/vim 文本编辑里常用的复制、移动、粘贴、撤销操作,掌握后能高效处理文本~

这是 vi 编辑器的保存和退出命令说明,各命令功能如下:

命令功能解释
:q退出未修改的文件;若文件有修改未保存,执行会无效(防止误关丢失内容)
:q!强制退出,不保存任何修改内容(需谨慎用,避免丢数据)
:w保存文件,但不退出 vi 编辑器(可继续编辑)
:x等价于 :wq保存文件并退出(文件有修改时保存,无修改时直接退出)
:w File把当前内容另存为指定文件 File(原文件内容不变)
:r File把指定文件 File 的内容读入 / 插入到当前编辑文件的光标位置

这些是使用 vi/vim 时管理文件保存、退出的核心命令,日常编辑文本经常会用到~

9. vim编辑器使用(2)

快速定位:在命令模式中(使用以下内容)

  • 行定位:

    • 1G: 移动到文件第一行

    • G: 移动到文件最后一行

    • :n: 移动到第n行(如:10到第10行)

    • 行号显示:

      • :set nu: 显示行号

      • :set nonu: 隐藏行号

  • vim中的查找:

    基本查找:

    • 查找字符串:

      • /string: 查找指定字符串(如/printf查找printf)

      • n: 向下继续查找

      • N: 向上继续查找

    • 正则表达式支持:

      • /^string: 查找以string开头的行

      • /string$: 查找以string结尾的行

  • Vim中的替换

    基本语法: 冒号开头表示底行命令,格式为:

    范围s/旧字符串/新字符串/标志
    • 范围省略: 当范围省略时,默认对当前行进行操作

    • 特殊符号:

      • .表示当前行

      • $表示最后一行

      • %表示全文范围

      • 当前行替换: :s/old/new 仅替换当前行第一个匹配项

        • 指定行范围:

          • :10,15s/old/new/g 替换10-15行所有匹配项

          • :.,$s/old/new 从当前行到最后一行替换

        • 全文替换:

          • :1,$s/old/new/g 从第一行到最后一行替换

          • :%s/old/new/g 全文替换的简写形式

嵌入式开发基础知识

编程基础知识

  • 学习目的:掌握计算机基础知识有助于后续编程时的理解和应用

  • 核心内容:包括计算机基本构成、程序语言发展过程和编程步骤等常识性知识

  • 学习方法:已掌握者可复习巩固,未掌握者需认真学习这些基础概念

计算机基本结构

冯诺依曼模型

  • 核心思想:包含硬件构成和存储程序两大核心概念

  • 硬件组成:

    • CPU:包含运算器(执行实际运算)和控制器(取指令 / 数据)

    • 存储器:主要指内存(程序运行时的临时数据存储)

    • 输入设备:如键盘、手写板、串口等

    • 输出设备:如显示器、文件、数据库等

  • 工作方式:计算机通过顺序执行存储器中的程序指令来运行

  • 应用范围:该模型适用于各类计算设备(PC、手机、开发板等)

存储器的分类

  • 主存储器(内存):

    • 功能:存储待处理数据和运算结果

    • 特点:直接影响系统运行流畅度(如 Windows 需 5-6GB 空闲内存)

    • 实例:内存条(2GB/4GB/8GB/16GB 等规格)

  • 外存储器:

    • 功能:长期保存数据的大容量存储

    • 实例:硬盘、U 盘、SD 卡、Flash 等

  • 寄存器:

    • 位置:CPU 内部

    • 特点:访问速度最快的高速存储器

    • 功能:直接参与 CPU 运算过程

  • 层级关系:

    1. 外存(硬盘 / Flash)→ 2. 内存 → 3. 寄存器

  • 数据流向:程序文件从外存加载到内存,CPU 通过寄存器处理数据

  • 硬件协作:包含 MMU(内存管理单元)进行地址映射

什么是程序

程序的定义

  • 本质概念:广义上指为实现特定目标而预先设计的一组可操作工作步骤

  • 英文术语:英文称为 "program",源自冯・诺依曼计算机体系结构思想

  • 控制作用:计算机通过程序控制硬件组件(输入 / 输出设备、运算器、控制器、存储器)协同工作

程序从程序员角度看

  • 执行文件本质:系统可直接识别的有序二进制指令集合(如 Windows 的.exe,Linux 的可执行文件)

  • 存储与加载:程序平时存储在磁盘,执行时加载到内存运行

  • 与源代码区别:程序员常说的 "C 程序" 指源代码文件,与最终二进制执行程序存在编译转换过程

程序在处理器中的执行过程

  • 硬件组成:包含 CPU 核心、执行单元、内存管理单元 (MMU)、总线接口等组件

  • 地址转换:程序使用虚拟地址,由 MMU 转换为物理地址访问实际内存

  • 学习路径:后续课程将通过变量、指针等知识点逐步深入讲解内存管理机制

程序设计语言的发展

机器语言

  • 编码形式:直接使用二进制序列表示的机器指令(如 10010101 等)

  • 历史载体:早期采用纸带打孔方式存储程序(60-70 年代主流)

  • 主要缺陷:

    • 与自然语言差异极大,难以记忆和理解

    • 开发维护工作量大、效率低下

    • 完全依赖特定硬件,无法移植

汇编语言

  • 改进原理:用符号表示机器指令(如 MOV 指令操作寄存器和内存)

  • 相对优势:比机器语言更接近自然语言,降低编程门槛

  • 现存局限:

    • 仍需熟悉硬件架构(如寄存器操作)

    • 平台依赖性极强(x86 与 ARM 汇编不兼容)

    • 嵌入式开发中主要用于阅读和局部修改

高级语言

  • 核心特征:

    • 脱离特定计算机系统(如 BASIC、FORTRAN、C/C++ 等)

    • 单条语句对应多条机器指令

    • 采用类自然语言关键字(if/else/for 等)

  • 发展脉络

    • 面向过程(C 语言)→面向对象(C++/Java/C#)

  • 现代趋势:脚本语言(Python/Shell 等)进一步降低开发难度

  • 嵌入式应用:

    • Linux 内核采用 C 语言编写

    • 智能硬件开发主要使用 C + 汇编的混合编程模式

  • 行业影响:语言门槛降低推动 IT 行业快速发展,催生移动互联网、人工智能等新技术浪潮

程序设计步骤

  • 基本流程:编辑→编译→链接→执行→调试的循环过程(SAASE 模型)

  • 工具链:

    • 编辑工具:VI 编辑器是核心工具,需要频繁使用

    • 编译工具:使用 GCC 编译器进行编译

    • 链接工具:通过 ld 命令完成链接

  • 工作特点:

    • 程序员日常工作就是不断修改代码、调试 bug 的循环

    • 需要保持专注和耐心("踏踏实实,心无旁骛")

    • 调试环节尤为重要,被称为 "bug 终结者" 阶段

  • 注意事项:

    • VI 编辑器的重要性:在整个开发过程中需要频繁使用

    • 开发过程是迭代式的,需要反复修改和测试

总结

  • 核心内容:

    • 计算机基本结构(冯・诺依曼体系)

    • 程序的定义与本质

    • 存储器的工作原理

    • 程序设计语言发展历程

    • 程序设计完整步骤

  • 课程特点:

    • 基础知识覆盖面广但较零散

    • 为后续编程实践奠定理论基础

  • 重要性:

    • 这些基础知识是理解编程本质的前提

    • 缺乏这些知识会导致 "不理解每天在做什么"

  • 后续预告:

    • 将逐步增加实际编程训练量

    • 重点转向编程、调试、执行等实践环节

知识小结

知识点核心内容考试重点 / 易混淆点难度系数
计算机基本结构(冯诺依曼模型)计算机硬件构成:输入 / 输出设备、运算器、控制器、存储器(内存 / 外存 / 寄存器);程序控制思想存储器层级关系(寄存器→内存→外存)与功能区分⭐⭐
程序定义与本质程序为特定功能设计的操作步骤;实际指二进制可执行文件(如.exe)程序源代码≠可执行文件(编译链接过程)⭐⭐
编程语言发展史机器语言(0101)→汇编语言(符号化)→高级语言(面向过程 / 对象)汇编语言平台依赖性(x86 vs ARM)与高级语言抽象层级⭐⭐⭐
编程实践步骤编辑→编译→调试循环;工具链(VI 编辑器 / GCC 编译器 /ld 链接器)调试环节重要性(Bug 修复占开发主要时间)⭐⭐
存储系统层级CPU 寄存器→内存→外存(硬盘 / Flash);MMU 虚拟地址映射机制


数据的表示

计算机数据表示

  • 数据分类:计算机处理的数据分为数值型数据(可算术运算,如数字 )和非数值型数据(不可算术运算,如字母、符号、音视频等 )。

  • 底层原理:所有数据最终都以 0 和 1 的组合形式被计算机处理,包括文字、符号等非数值数据。

数值数据的表示

基数与各数位的权

  • 基数定义:某进制中允许使用的基本数码个数。十进制基数为 10(数码 0 - 9 ),八进制基数为 8(数码 0 - 7 ) 。

  • 位权计算:以基数为底,数字所在位置的序号为指数的整数次幂。例如十进制数中,从右往左数第 n 位(从 0 开始计数 )的位权是 (10^n) 。

二进制

  • 数码组成:仅包含 0 和 1 两种数码,逢 2 进位。

  • 转换示例:二进制转十进制,如 (101_2 = 1×2^2 + 0×2^1 + 1×2^0 = 5_{10}) 。

  • 计数规律:二进制数顺序如 (0, 1, 10, 11, 100\cdots) ,对应十进制 (0, 1, 2, 3, 4\cdots) 。

十六进制

  • 数码组成:包含 0 - 9 和 A - F(A 对应 10 ,F 对应 15 )共 16 种数码,逢 16 进位。

  • 前缀标识:编程中常用 0x 前缀表示十六进制数(如 0x1A )。

  • 转换关系:1 个十六进制数码对应 4 位二进制(如 0xF 对应 1111 ),转换时可直接拆分替换。

八进制

  • 数码组成:包含 0 - 7 共 8 种数码,逢 8 进位(如 7 的下一位是 10 )。

  • 前缀标识:通常以数字 0 开头表示(如 012 表示八进制数 )。

  • 转换示例:八进制 12 ,计算为 (1×8^1 + 2×8^0 = 10_{10}) (十进制 )。

  • 二进制关系:1 个八进制数码对应 3 位二进制(如 07 对应 111 )。

应用案例

例题:十进制转二进制

  • 转换方法:采用 “除 2 取余,逆序排列” 法。以十进制 25 为例:

    25÷2 = 12 余 1 
    12÷2 = 6 余 0 
    6÷2 = 3 余 0 
    3÷2 = 1 余 1 
    1÷2 = 0 余 1 
  • 结果表示:将余数逆序排列得到 11001

  • 验证计算:(1×2^4 + 1×2^3 + 0×2^2 + 0×2^1 + 1×2^0 = 25) 。

  • 通用规则:该方法同样适用于十进制转八进制、十六进制等其他进制转换。

原码、反码和补码

  • 正数表示:

    • 规则:正数的原码、反码、补码完全相同。

    • 示例:十进制 5 的三种表示均为 101(8 位表示时为 00000101 )。

  • 负数表示(以 8 位二进制表示 -5 为例):

    • 原码:符号位 1 表示负,数值部分与正数相同,示例 10000101(最高位 1 为符号位,后 7 位 0000101 表示 5 )。

    • 反码:符号位不变,数值部分按位取反,示例 11111010

    • 补码:反码加 1 ,示例 11111011

  • 符号位规则:最高位为符号位,0 表示正数,1 表示负数。

  • 计算步骤:

    1. 写出绝对值的二进制表示(原码)。

    2. 符号位置 1(负数)。

    3. 数值部分取反(反码)。

    4. 最后加 1(补码)。

  • 存储原理:计算机实际存储和运算使用的是补码形式。

非数值数据表示

ASCII 编码

  • 编码标准:美国国家信息交换标准代码 (ASCII) ,将字符转换为二进制编码形式。

  • 编码范围:共 256 个字符(0 - 255 ),对应 1 字节存储空间(8 位 )。

  • 字符类型:包括文字、符号、图像、语言和逻辑信息等非数值数据。

编码分区
  • 控制字符区(00H - 1FH):共 32 个字符,用于通讯或控制,部分字符不可显示(如 NUL、SOH 等控制符 )。

  • 可显示字符区(20H - 7FH):共 96 个字符,包含阿拉伯数字、大小写字母及常见符号,全部可在屏幕上显示。

  • 扩展字符区(80H - FFH):共 128 个字符,由 IBM 制定,包含框线、音标等非标准字符。

编码细节
  • 编码格式:同时显示八进制、十进制、十六进制和对应字符。

  • 特殊字符:

    • 0:NUL(空字符);7:BEL(响铃);9:HT(水平制表);10:LF(换行);13:CR(回车) 。

  • 字符转换原理:每个字符对应唯一整数值(如 'A' = 65 ),计算机实际处理的是该数值的二进制形式,转换方法为查表获取十进制值→转换为二进制。

  • 存储特性:字符型 (char) 占 1 字节(8 位 ),无符号字符范围:(0 - 255)(计算公式:最大值 (= 2^8 - 1 = 255) )。

  • '0' 与 0 的区别:字符 '0' 的 ASCII 值为 48(十进制),整数 0 的二进制表示为 00000000 ;计算机处理时,字符 '0' → 48 → 00110000

总结与思考

  • 核心要点:掌握进制转换方法;理解 ASCII 编码原理;区分字符与数值的存储方式。

  • 延伸思考:字符数据通过查表对应整数值表示;字符 '0'(ASCII 48 )与整数 0 本质不同;不同编码标准(如 Unicode )的区别。

知识小结

知识点核心内容考试重点 / 易混淆点难度系数
编程语言学习规律从数据表示与存储入手 → 数据类型 / 变量 → 运算符 / 表达式 → 控制语句 → 函数 / 指针 → 面向对象(类)语言共性规律 vs 面向对象特性差异⭐⭐
计算机数据分类数值型数据(可算术运算) vs 非数值型数据(字符 / 音视频等)二进制存储本质与人类十进制习惯差异⭐⭐
进制系统二进制(基数为 2 )、八进制(基数为 8 )、十进制(基数为 10 )、十六进制(基数为 16 )进制转换方法(除基取余法)与权值计算⭐⭐⭐
原码 / 反码 / 补码正数三码相同;负数符号位固定(1 表示负),反码取反,补码 +1补码的计算机存储优势(统一加减法)⭐⭐⭐⭐
ASCII 编码表字符与整数的映射标准(如字符 '0' = 48 ),覆盖 0 - 255 无符号字符范围字符 '0' 与整数 0 的本质区别(ASCII 值 48 vs 数值 0 )⭐⭐
进制转换实操十进制 25 转二进制:11001(通过连续除 2 取余逆序)高位补零规则(如 8 位二进制表示)⭐⭐⭐
非数值数据存储文字 / 符号通过编码标准(如 ASCII )转为二进制处理音视频等复杂数据的非数值特性

程序的编译和调试

gcc 编译器

实例操作

  • 基本功能:GCC(GNU Compiler)是 GNU 推出的多平台编译器,可将 C、C++ 源程序编译连接成可执行文件。

  • 支持文件类型:

    • .c:C 语言源代码

    • .h:程序包含的头文件

    • .i:已预处理过的 C 源代码文件

    • .S:汇编语言源代码文件

    • .o:编译后的目标文件

  • 编译语法:

    • 基本格式gcc 源文件 -o 输出文件名 ,示例 gcc hello.c -o hello

    • 默认输出:不指定 -o 时生成 a.out 可执行文件。

    • 常用选项:

      • -c:只生成目标文件(.o)而不链接 。

      • -g:生成调试信息(用于 gdb 调试) 。

      • -Wall:显示所有警告信息 。

  • 执行方法:使用 ./可执行文件名 运行程序,如 ./hello

  • 文件管理mkdir 创建目录;mv 移动文件;rm 删除文件 。

  • 调试技巧:修改源代码后必须重新编译才能生效;建议为每个可执行文件指定不同名称,避免默认的 a.out 互相覆盖 。

实战演练

  • 基础编译流程:

    • 使用 vi 编写源代码(test.c )。

    • 编译:gcc test.c -o test -Wall

    • 执行:./test

  • 常见错误处理:缺少头文件(如 stdio.h )会导致警告;语法错误会在编译时显示具体行号;建议始终使用 -Wall 选项显示所有警告 。

  • 实战案例

    (计算 1 + 2 +... + 10 的程序):

    • 源代码

#include <stdio.h>
int main() {int sum = 0;for (int i = 1; i <= 10; i++) {sum += i;}printf("%d\n", sum);return 0;
}

  • 编译执行gcc test.c -o test -Wall && ./test

  • 预期输出55

  • 开发效率技巧Ctrl + Shift + N 打开新终端窗口;Ctrl + Shift + T 在当前窗口新建标签页;可在不同窗口同时编辑和编译代码 。

程序调试

基础调试宏

  • 预定义宏__FILE____LINE____FUNCTION__ 是 C 语言头文件中定义好的调试宏,可直接使用 。

  • 宏功能

    • __FILE__:显示当前源文件名(如 test.c )。

    • __FUNCTION__:显示当前函数名(如 main 函数或调用的其他函数 )。

    • __LINE__:显示当前代码行号 。

  • 应用场景:在代码较长时,可用于日志记录,帮助定位问题发生的具体位置(文件、函数、行号 )。

调试宏使用示例

  • 语法要点:必须使用双下划线(__ ),不是单下划线;宏名称全部大写;正确拼写:__FUNCTION__(注意包含字母 C ) 。

  • 常见错误:拼写错误会导致 undeclared identifier 编译错误;参数类型不匹配会触发格式警告(如用 %s 输出整型变量 )。

  • 调试过程:编译器会明确指出错误位置和类型;需要检查宏拼写和参数对应关系;示例中 m 是整型变量,应与 %d 格式符对应 。

实际应用价值

  • 输出示例test2.c, main, 9 m=55 表示文件 test2.c 、函数 main 、行号 9 、变量值 55

  • 工程实践:服务器程序中关键操作应记录日志;通过调试宏可精确定位日志来源;避免日志过长成为流水账,增加可读性 。

  • 调试建议:编译错误是正常学习过程;应学会阅读编译器错误提示;小错误(如拼写、格式)可能产生大量错误信息 。

C 语言基础

程序的基本组成

  • 数据描述:程序中需要明确指定数据的类型和组织形式(数据结构),包括线性结构(如数组、链表 )、树形结构、图状结构和集合结构 。

  • 操作描述:即算法,指完成操作的具体步骤,如对数据结构的增删改查等操作流程 。

算法基础概念

  • 定义:为解决特定问题而采取的有序步骤集合,强调步骤的完整性和顺序性 。

  • 实例说明

    (判断闰年):

    1. 输入年份 year

    2. 判断 year 能否被 4 整除 。

    3. 若能,继续判断能否被 100 整除 。

    4. 根据条件分支得出最终结论 。

  • 编程思维培养:通过算法训练可提升逻辑严谨性,培养冷静分析问题的能力 。

简单算法实例

  • 阶乘计算原始方法:

    • 步骤分解:

      • S1) 计算 1×2

      • S2) 结果 ×3

      • S3) 结果 ×4

      • ...

      • S9) 结果 ×10

    • 局限性:代码冗长,无法处理大规模数据(如计算 100 的阶乘 )。

  • 循环优化算法:

    • 变量设计p 为被乘数(初始值 1 );i 为乘数(初始值 2 ) 。

    • 算法流程:

      1. p = 1

      2. i = 2

      3. p = p × i

      4. i = i + 1

      5. i ≤ 10 则返回步骤 3

    • 优势:通过循环结构简化代码,可轻松扩展计算范围(如改为 1×100 )。

代码实现演示

  • 关键代码

#include <stdio.h>
int main() {int p = 1;for (int i = 2; i <= 10; i++) {p *= i;}printf("%d\n", p);return 0;
}
  • 调试技巧:建议复制 test2.ctest3.c 进行修改测试,使用 gcc 编译时可通过 -o 指定输出文件名 。

总结

课程要点回顾

  • 工具掌握gcc 编译器基本使用方法;使用 __FILE____FUNCTION____LINE__ 等宏进行基础调试 。

  • 核心概念:数据结构与算法的关系;编程逻辑思维的建立方法 。

扩展思考

  • 交叉编译:在 x86 平台开发 ARM 程序时,只需将 gcc 替换为 arm - gcc 交叉编译器,源代码无需修改 。

  • 学习建议:通过大量编程实践(建议从 1 加到 100 等基础算法开始)快速提升编程能力,建立编程思维 。

知识小结

知识点核心内容考试重点 / 易混淆点难度系数
GCC 编译器基础介绍GCC 编译器的基本语法(gcc 源文件 -o 可执行文件 )、默认生成 a.out 、警告选项 -Wall-o 选项的位置灵活性(可置于中间或末尾)⭐⭐
编译流程与调试从源代码到可执行文件的完整流程(预处理→编译→汇编→链接 )未重新编译导致执行旧版本(需强调修改后必须重新编译)⭐⭐⭐
基础调试技巧使用宏 __FILE____FUNCTION____LINE__ 打印调试信息,辅助定位日志宏拼写易错(双下划线、大小写敏感)⭐⭐
算法与数据结构程序 = 数据结构 + 算法;示例:1 到 10 求和(直接累加 vs 循环优化 )循环逻辑的抽象思维(变量累乘 / 累加的实现差异)⭐⭐⭐⭐
交叉编译概念开发板(ARM)与 PC(x86)的代码移植,需使用 arm - gcc 交叉编译器代码无需修改,仅更换编译器⭐⭐⭐
编程思维训练强调逻辑严谨性(如闰年判断的算法步骤)、调试耐心(错误量与代码量无关 )初学者常见误区(逐行硬编码 vs 抽象逻辑实现)⭐⭐⭐⭐

扩展问题

介绍一下gcc编译的原理

除了gcc,还有哪些常用的C/C++编译器?

如何在Windows系统中使用命令行工具查看ASCII码表?

http://www.dtcms.com/a/277208.html

相关文章:

  • 协程的基本使用
  • 【保姆级图文详解】MCP架构(客户端-服务端)、三种方式使用MCP服务、Spring AI MCP客户端和服务端开发、MCP部署方案、MCP安全性
  • 基于 CentOS 7 的 LVS+DR+Web+NFS 旅游攻略分享平台部署
  • CentOS系统下前后端项目部署攻略
  • 从 Manifest V2 升级到 Manifest V3:常见问题与解决方案
  • vue-component
  • [Linux入门 ] RAID存储技术概述
  • (S4)Efficiently Modeling Long Sequences with Structured State Spaces论文精读(逐段解析)
  • [Rust 基础课程]Hello World
  • 数据结构 单链表(2)--单链表的实现
  • 聊一聊Java生态接口测试常见的框架
  • 在 Spring Boot 中使用 MyBatis 的 XML 文件编写 SQL 语句详解
  • MySQL SQL语句精要:DDL、DML与DCL的深度探究
  • Design Compiler:什么是代价函数(Cost Function)
  • HarmonyOS组件/模板集成创新活动-元服务小云体重管理引入案例(步骤条UI组件)
  • python赤道上空的大气环流剖面图(纬向-高度剖面)
  • 多级@JsonTypeInfo和@JsonSubTypes注解使用详解及场景分析
  • 剑指offer59_翻转单词顺序
  • Redis 命令总结
  • Docker三剑客
  • Docker 基于 Cgroups 实现资源限制详解【实战+源码】
  • 从一个想法到一套软件——我的AI质检平台设计蓝图
  • 03.Python 字符串中的空白字符处理
  • 【爬虫】02 - 静态页面的抓取和解析
  • HTTP与HTTPS详解
  • 面试150 填充每个节点的下一个右侧节点指针Ⅱ
  • python函数快捷的传变量地址
  • 2025江苏省信息安全管理与评估赛项二三阶段任务书
  • docker 设置代理以及配置镜像加速
  • 【C++】优先队列简介与模拟实现 + 仿函数